__STDC_LIB_EXT1__ доступность в gcc и clang

Так как беглый поиск в гугле ничего не нашел, попробую спросить здесь (поскольку здесь ошивается много людей, занимающихся gcc/clang) - Каков статус __STDC_LIB_EXT1__ в gcc/clang? Мы разрабатываем кроссплатформенное приложение, и я хотел использовать некоторые функции проверки безопасных границ из <stdio.h> (которые чудом доступны в Visual Studio 2017), но не смог скомпилировать код с Xcode 9.2. Я предположил, что версия clang, которую использует Xcode, устарела, но gcc 6.3.0 в Ubuntu ведет себя так же. Я пытаюсь использовать tmpnam_s со следующим примером:

#if defined(__STDC_LIB_EXT1__)
#define  __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#else
#error "__STDC_LIB_EXT1__ not defined"
#endif

int main(int argc, char** argv)
{
    char t[L_tmpnam_s]; 
    tmpnam_s(t, L_tmpnam_s);
    return 0;
}

Но компиляция завершается ошибкой, макрос не определен:

gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~

Я что-то не так делаю или этот набор функций просто плохо поддерживается?


person Rudolfs Bundulis    schedule 18.12.2017    source источник
comment
Это, афаик, плохо поддерживается. Единственная причина, по которой он есть у VS, заключается в том, что он в значительной степени исходит оттуда. Однако VS не поддерживает какой-либо новый или старый стандарт C, так что это еще одна проблема.   -  person Lundin    schedule 18.12.2017
comment
проверка безопасных границ, функция, созданная Microsoft, используется только разработчиком Microsoft. Никому в мире C это не нужно, потому что они совершенно бесполезны. Комитет добавил эти дополнительные функции, потому что этого хочет Microsoft. Они дублируют другие функции и не более безопасны, чем классические функции.   -  person Stargateur    schedule 18.12.2017
comment
Если вы хотите выполнить компиляцию и проверку во время выполнения с помощью gcc и clang, вы должны использовать -D_FORTIFY_SOURCE=2. Это намного проще, потому что компиляция сделает всю работу за вас. blog.quarkslab.com/clang-hardening-cheat-sheet.html   -  person Stargateur    schedule 18.12.2017
comment
@Stargateur Я просто хотел переносимый код. Visual Studio 2017 жалуется, если используются небезопасные функции (конечно, я могу отключить это в крайнем случае).   -  person Rudolfs Bundulis    schedule 18.12.2017
comment
Несмотря на то, что MS предложила эти функции, их реализация немного отличается от финального стандартного приложения C. Таким образом, даже если бы другие компиляторы реализовали стандарт, код все равно не был бы переносимым. Отключение предупреждений кажется лучшей идеей.   -  person Bo Persson    schedule 18.12.2017
comment
Вы знаете, поддерживает ли GCC это сейчас? У меня такая же проблема   -  person Gert Kommer    schedule 18.06.2020


Ответы (1)


Весь набор «безопасных» функций с суффиксами _s плохо поддерживается. Microsoft написала набор функций с суффиксами _s и представила его комитету по стандартизации C для стандартизации. Комитет внес некоторые изменения (возможно, по необходимости) и составил технический отчет TR 24731-1. Слегка измененная версия ТР была включена в качестве необязательного Приложения K (обязательного) в стандарт C11, ISO/IEC 9899:2011.

Вы можете найти много грязных подробностей в ответах на Используете ли вы "более безопасные" функции TR-24731?, особенно в примечания в моем ответе на этот вопрос, и особенно ссылка на документ комитета Standard C Полевой опыт N1967 с Приложением K — Интерфейсы проверки границ.

Я не знаю, каков текущий статус предложения N1967, но то, что оно было предложено, говорит само за себя. N1967 также содержит ссылки на библиотеки, поддерживающие Приложение K/TR-24731-1 — список ограничен.

Обратите внимание, что Microsoft не реализует библиотеку, указанную в стандарте C11. Он реализует приближение к стандарту, но есть принципиальные отличия. Это имело бы большее значение, если бы стандарт был реализован в какой-либо другой системе, но функции не были реализованы в какой-либо общепринятой форме (так, например, библиотека GNU C не поддерживает их и не будет поддерживать).

person Jonathan Leffler    schedule 19.06.2018