禁止在 g++(gcc)或 clang(llvm)中使用内联汇编

6
有一些解决问题的网站,例如topcoder.comSPOJ。 我希望对于类似的用例(人们向我发送C++程序文件),可以进行一些限制。
其中之一是:
  • “不允许使用内联汇编”
如何强制执行这种禁令?除了在源代码中搜索短语之外,是否有更智能的方法(例如编译器标志?-但我没有找到任何有用的)?
我可以限制人们使用g++或clang。这些事情正在Linux上完成。

你为什么想这样做?如果你担心安全问题,限制内联汇编并不能帮助太多。 - servn
@servn 好的。但我不仅担心安全问题,还担心公平的C/C++竞争。我希望防止人们使用汇编语言,只是因为我们决定了这样的规则。我想自动化这种政策的过程。我知道这不是完整的解决方案,还需要更多的东西。感谢您指出这一点。也许您有更多的想法?如果您对安全感兴趣,请查看我的其他问题:[Security.SE](http://security.stackexchange.com/users/4077?tab=questions) - Grzegorz Wierzowiecki
2个回答

4
如何考虑:
% gcc -Dasm=error -D__asm__=error

它是如何工作的?我了解它使用名称为 asm__asm__ 的宏。是否允许遮蔽内置关键字?我能否像禁止函数调用(如 "system()")一样做同样的事情?这是安全的解决方案吗 - 没有绕过它(黑客)的方法吗? - Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki 预处理器在编译器之前就开始处理代码,它不知道关键字,所以它可以改变它们。这是可以解决的 - 在代码中简单地使用 #undef asm 就可以了。虽然这很容易被发现。 - Alnitak
每次我看国际混淆C代码大赛,我都越来越担心有一些混淆的方法,比如#undef asm - Grzegorz Wierzowiecki
1
@GrzegorzWierzowiecki 是的,利用技术来执行政策很难。总有方法可以绕过它。 - Alnitak
根据答案,我不知道我可以使用预处理器来模拟关键字。非常感谢 - 它为我提供了新的可能性 :)。 - Grzegorz Wierzowiecki

0

看起来你正在寻找-fno-asm标志。

虽然它看起来只是执行asm而不是执行__asm__,所以可能需要添加一个-D__asm__=something_that_will_error

还要查看-fno-gnu-keywords以关闭C++中的asm


2
Linux下的gcc 4.4.6手册表明这不会禁用__asm__ - Alnitak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接