запретить встроенную сборку в g++ (gcc) или clang (llvm)

Существуют сайты для решения проблем, такие как topcoder.com, SPOJ. Я хотел бы, чтобы для аналогичного варианта использования (люди присылали мне программные файлы C++) были некоторые ограничения.

Один из них:

  • "не допускается использование встроенной сборки"

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

Я могу ограничить людей до g++ или clang. Что-то делается на Linux.


person Grzegorz Wierzowiecki    schedule 13.01.2012    source источник
comment
Почему вы хотите это сделать? Ограничение встроенного ассемблера не очень поможет, если вы беспокоитесь о безопасности.   -  person servn    schedule 14.01.2012
comment
@servn Хорошо. Но я беспокоюсь не только о безопасности, но и о честной конкуренции C/C++. Я бы хотел, чтобы люди не использовали ассемблер только потому, что мы решили ввести такое правило. Я хочу автоматизировать процесс такой политики. Я понимаю, что это не полное решение, и нужно больше. Спасибо, что указали на это. Может быть, у вас есть еще идеи? Если вас интересует безопасность, ознакомьтесь с другими моими вопросами: Security.SE   -  person Grzegorz Wierzowiecki    schedule 14.01.2012


Ответы (2)


Как насчет:

% gcc -Dasm=error -D__asm__=error
person Alnitak    schedule 13.01.2012
comment
Как это работает? Я так понимаю он делает макросы с именами: asm, __asm__. Разрешено ли затенение встроенных ключевых слов? Могу ли я сделать то же самое для запрета вызовов функций (например, system())? Это безопасное решение - нет способа обойти его (взломать)? - person Grzegorz Wierzowiecki; 13.01.2012
comment
@GrzegorzWierzowiecki, препроцессор получает код перед компилятором и не знает ключевых слов, поэтому да, он может их изменить. Это можно обойти - простой #undef asm в коде сделает это. Хотя это было бы легко найти. - person Alnitak; 13.01.2012
comment
Каждый раз, когда я смотрю на [The International Obfuscated C Code Contest](ioccc.org), я все больше и больше боюсь, что есть способы запутать вещи, например #undef asm. - person Grzegorz Wierzowiecki; 13.01.2012
comment
@GrzegorzWierzowiecki да, технологии сложно использовать для обеспечения соблюдения политики. Есть всегда способы обойти это. - person Alnitak; 13.01.2012
comment
Согласно ответу, я не представлял, что могу скрывать ключевые слова с помощью препроцессора. Большое спасибо - это дает новые возможности :). - person Grzegorz Wierzowiecki; 13.01.2012

Похоже, вы ищете флаг -fno-asm.

Хотя похоже, что это просто делает asm, а не __asm__, так что, возможно, добавьте -D__asm__=something_that_will_error.

Также посмотрите на -fno-gnu-keywords для отключения asm в C++.

person mattjgalloway    schedule 13.01.2012
comment
Справочная страница gcc 4.4.6 под Linux подразумевает, что это не отключает __asm__. - person Alnitak; 13.01.2012