【C言語】
配列の添え字チェックを先に
if(buf[idx] && idx < MAX)

(style) Array index ‘idx’ is used before limits check.

警告:配列添え字を範囲チェック前に使った[(style)arrayIndexThenCheck]

warning: The left operand of ‘!=’ is a garbage value due to array index out of bounds
[core.UndefinedBinaryOperatorResult]


■✖ if(配列[添字] && 添字範囲確認)

#include    <stdio.h>
#define MAX 4
char *func(char *ary[],unsigned int idx)
{
    if((ary[idx]!=NULL) && (idx<MAX)){   
        return  ary[idx];
    }
    return  "無色";
}
static char *RGB[MAX]={"赤","緑","青",NULL};
int main(void) {
    printf("%s\n",func(RGB,0));
    printf("%s\n",func(RGB,1));
    printf("%s\n",func(RGB,2));
    printf("%s\n",func(RGB,3));
    printf("%s\n",func(RGB,4));
}

if((ary[idx]!=NULL) && (idx<MAX)){は
第一条件(ary[idx]!=NULL) と
第二条件 (idx<MAX)を
同時に評価するのではなく
左から順番に評価します。

このため(ary[idx]を参照してしまった後で
(idx<MAX)のガードをかけても手遅れで、
配列領域外参照が発生する可能性があります。

参考:


■◎ if(添字範囲確認 && 配列[添字])

#include    <stdio.h>
#define MAX 4
char *func(char *ary[],unsigned int idx)
{
    if((idx<MAX) && (ary[idx]!=NULL)){   
        return  ary[idx];
    }
    return  "無色";
}
static char *RGB[MAX]={"赤","緑","青",NULL};
int main(void) {
    printf("%s\n",func(RGB,0));
    printf("%s\n",func(RGB,1));
    printf("%s\n",func(RGB,2));
    printf("%s\n",func(RGB,3));
    printf("%s\n",func(RGB,4));
}

if((idx<MAX) && (ary[idx]!=NULL))と
記述すると
第一条件(idx<MAX) が成立しなければ
第二条件(ary[idx]!=NULL)は評価されないので
配列領域外参照は発生しません。