Есть ли какие-либо советы по отключению программиста от использования snprintf на этапе компиляции / компоновки - PullRequest
0 голосов
/ 08 мая 2020

Наш заказчик призывает нас заменить небезопасные c функции, такие как snprintf / sscanf / strncat ..., безопасными версиями, такими как snprintf_s / sscanf_s / strncat_s ... в наших продуктах.

Больше, чем замена , интересно, есть ли какие-либо советы по контролю компиляции / компоновки, чтобы запретить нашим разработчикам программного обеспечения использовать эти небезопасные функции c в будущем?

Спасибо.

Ответы [ 2 ]

1 голос
/ 08 мая 2020

G CC позволяет отравлять функции, которые вы не хотите использовать. Это можно сделать с помощью директивы предварительной обработки прагмы. Например, приведенный ниже код не будет компилироваться на G CC, поскольку printf помечен как отравленный.

# pragma GCC poison printf

# include <stdio.h>

int main()
{
  printf("Hello World");
  return 0;
}

EDIT: Прагмы зависят от компилятора. Поэтому, если вы используете прагмы для отравления, я бы предложил использовать их вместе с #ifdef и #warning или #error для проверки компиляторов.

#ifdef __GNUC__
# pragma GCC poison printf
#else
#warning Compiling with compiler other than gcc. Use of unsafe functions not tested
#endif

Для проверки компиляторов см. Как в #ifdef от CompilerType? G CC или VC ++

0 голосов
/ 08 мая 2020

Прежде всего, вы можете просто переопределить их, например, #define snprintf snprintf_s. Их подписи равны.

Если вы просто хотите сгенерировать ошибку компилятора, самый простой способ - всегда включать заголовок с переопределением всех функций, которые вы хотите заблокировать.

Эти переопределения могут вызвать синтаксическую ошибку, а также указать пользователю причину ошибки:

#include <stdio.h>

#define snprintf {"Unsafe! Use snprintf_s instead!"}
#define sscanf {"Unsafe! Use sscanf_s instead!"}
#define strncat {"Unsafe! Use strncat_s instead!"}

Вы можете создать такой заголовок (назовем его force_safe.h) и включить его в начале каждого исходного файла. В G CC вы также можете сделать это во флагах компилятора (например, gcc -iforce_safe.h ...).

...