забранете вграденото асемблиране в g++ (gcc) или clang (llvm)

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

Един от тях е:

  • "не е разрешено използването на вграден монтаж"

Как мога да наложа такава забрана? Има ли по-интелигентен начин (като флагове на компилатор? - но не намерих полезен) от просто търсене на фрази в изходния код?

Мога да огранича хората до g++ или clang. Нещата се правят на Linux.


person Grzegorz Wierzowiecki    schedule 13.01.2012    source източник
comment
Защо искаш да направиш това? Ограничаването на inline asm не помага много, ако се притеснявате за сигурността.   -  person servn    schedule 14.01.2012
comment
@servn Добре. Но не се тревожа само за сигурността, но и за честната конкуренция на C/C++. Бих искал да попреча на хората да използват asm, само защото решихме за такова правило. Искам да автоматизирам процеса на такава политика. Разбирам, че това не е пълно решение и има нужда от повече. Благодаря, че го посочихте. Може би имате още идеи? Ако се интересувате от сигурност, моля, разгледайте другите ми въпроси: 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 man page под Linux предполага, че това не деактивира __asm__. - person Alnitak; 13.01.2012