Правило PC-lint/Flexelint против простого символа

PC-lint и Flexelint от Gimpel Software имеют правило "971: Использование 'char' без 'signed' или 'unsigned'", которое запрещает использование простого типа char без указания подписи.

http://www.gimpel.com/html/pub/msg.txt

Я думаю, что это неправильно. Если char используется как целочисленный тип, то может иметь смысл явно указывать подписанность, но не тогда, когда он используется для текстовых символов. Стандартные библиотечные функции, такие как printf, принимают указатели на простые char, а использование signed или unsigned char является несоответствием типов. Конечно, между типами можно выполнять приведение типов, но это может привести к ошибкам, которые lint пытается предотвратить.

Является ли это правило lint против простого типа char неправильным?


person Tor Klingberg    schedule 20.09.2012    source источник


Ответы (2)


Сообщения PC Lint в диапазоне 900–999 (и 1900–1999 для C++) называются «Выборочные заметки» и по умолчанию отключены. Они предназначены для использования, если у вас есть руководство по кодированию, которое имеет определенные ограничения. Затем вы можете активировать одну или несколько из этих заметок, чтобы помочь вам найти потенциальные нарушения. Я не думаю, что кто-то активировал все сообщения 9xx в реальных усилиях по разработке.

Вы правы насчет char: это использование байта (почти всегда) для реального символа. Однако компилятор C рассматривает char как знаковый или беззнаковый. Для C++ char отличается как от unsigned char, так и от signed char.

Во многих встроенных средах C, в которых я работал, было принято правило кодирования, утверждающее, что простой char не разрешен. Именно тогда это сообщение PC Lint должно быть активировано. Исключения, как и при взаимодействии с другими библиотеками, должны были быть явно разрешены, а затем использовать комментарий Lint для подавления отдельного сообщения.

person Johan Bezem    schedule 29.11.2012

Я предполагаю, что причина, по которой они решили заставить вас выбрать signed или unsigned, заключается в том, что стандарт C этого не делает. Стандартные состояния C char, unsigned char и signed char представляют собой три уникальных типа.

gcc, например, делает значение по умолчанию signed, но его можно изменить с помощью флага -funsigned-char.

Итак, ИМО, я бы сказал, что нет, это правило не является неправильным, оно просто пытается ужесточить спецификацию C.

person Mike    schedule 20.09.2012
comment
Проблема в том, что строковые литералы являются простыми char, поэтому в gcc будет выдано предупреждение: unsigned char * mystr = "foo"; - person Tor Klingberg; 20.09.2012