У меня есть следующий код:
int s[4096];
unsigned char o = 0;
int main(void) {
int *n;
return ((char *) (s + o)) == 0 ? *n : 0;
}
Когда я запускаю Clang Static Analyzer для этого кода, он предупреждает меня, что я разыменовываю n
, потому что (char *) (s + o)
является нулевым указателем, а это не так (я даже могу распечатать его и получить адрес, который определенно не равен нулю).
Что мне не хватает?
Я замечаю, что удаление приведения (char *)
приводит к исчезновению предупреждения.
o
это все равно не будет правдой. И это единственный кодовый путь во всей программе, поэтому ниs
, ниo
не могут иметь никаких других значений, кроме тех, что указаны в программе. Я также заметил, что удаление приведения(char *)
приводит к исчезновению предупреждения. - person rid   schedule 30.10.2019o
- этоunsigned char
, поэтому он может иметь значения только между0
и255
. - person rid   schedule 30.10.2019(char *) (s + o)
, уменьшается до(char *) s
сo == 0
. Теперь(char *)s
не может быть равным нулю, если только распределитель памяти ОС не поместил его в абсолютный 0 адрес памяти, то же самое касается толькоs
. У статических анализаторов есть ограничения, а также имейте в виду, что правила для языка различаются в зависимости от версии диалекта и компилятора. - person Javier Silva Ortíz   schedule 30.10.2019