Недавно я просматривал код, в котором clang генерировал предупреждения из-за -Wtautological-pointer-compare
.
Код можно упростить до чего-то вроде:
void foo(const char*s) __attribute__((nonnull)) {
if (s) { /* Test added just in case*/
if (s[0]=='a') s[0]='b'; /* Dummy code using the pointer */
}
}
Очевидно, что если мы доверяем атрибутам, то s
не может быть нулевым, а предупреждение является избыточным. Однако мне кажется, что лучше всего обрабатывать нулевой регистр в функции (поскольку мы не можем доверять тому, что вызывающий код скомпилирован с этими предупреждениями или что люди читают предупреждения), при этом все еще обнаруживая другие проблемы с нулевым указателем в коде.
Таким образом, отключение этого предупреждения (с использованием прагмы для всей функции) представляется неоптимальным.
В Visual Studio с SAL кажется, что вы можете использовать _In_ _Pre_defensive_
для обработки
этот случай.
В этом случае _In_ _Pre_defensive_
предпочтительнее в трасте
границы, чтобы указать, что, хотя вызывающая сторона получит ошибку, если она
Попытка передать NULL, тело функции будет проанализировано, как если бы
параметр может быть НЕДЕЙСТВИТЕЛЕН, и любые попытки отменить ссылку на указатель
без предварительной проверки его на NULL будет помечено.
Возможно ли нечто подобное с Clang?