2012-01-13 253 views
5

有问题解决网站,如topcoder.comSPOJ。 我想要类似的用例(人们给我C++程序文件)做一些限制。禁止在g ++(gcc)或clang(llvm)中使用内联汇编

其中之一是:

我如何执行这些禁令“未使用行内汇编入内”?有没有更聪明的方法(如编译器标志? - 但我没有发现任何有用的),而不仅仅是在源代码中搜索短语?

我可以限制人们使用g ++或clang。事情正在Linux上完成。

+0

你为什么要这么做?如果担心安全问题,限制内联asm并没有什么帮助。 – servn 2012-01-14 09:10:29

+0

@servn好的。但我不仅担心安全问题,而且公平的C/C++竞争。我想阻止人们使用asm,只是因为我们决定了这样的规则。我想自动化这种政策的过程。我知道这不是完整的解决方案,需要更多。感谢您指出。也许你有更多的想法?如果对安全感兴趣,请查看我的其他问题:[Security.SE](http://security.stackexchange.com/users/4077?tab=questions) – 2012-01-14 11:57:03

回答

0

您看起来像是在寻找-fno-asm标志。

虽然它看起来像asm而不是__asm__所以也许加上-D__asm__=something_that_will_error

另请参阅-fno-gnu-keywords关闭C++中的asm

+1

gcc 4.4.6在Linux下的manpage意味着这不会禁用'__asm__'。 – Alnitak 2012-01-13 09:59:16

4

如何:

% gcc -Dasm=error -D__asm__=error 
+0

它是如何工作的?我知道它使用宏名称:'asm','__asm__'。是否允许隐藏内置关键字?我可以做同样的禁止函数调用(如“system()”)吗?这是安全的解决方案 - 没有办法解决它(黑客)? – 2012-01-13 10:20:49

+1

@GrzegorzWierzowiecki预处理器在编译器之前掌握了代码,并且没有关键字的知识,所以是的,它可以改变它们。它可以被解决 - 代码中的一个简单的'#undef asm'就可以做到。这很容易找到。 – Alnitak 2012-01-13 10:25:40

+0

每次看[国际混淆C代码大赛](http://www.ioccc.org/),我越来越害怕有什么方法来混淆事物,比如'#undef asm'。 – 2012-01-13 10:45:36