【发布时间】:2013-11-12 04:26:45
【问题描述】:
用户在我的网站上提交代码(主要是 java)来解决简单的编程挑战,但是将代码发送到服务器进行编译和执行有时可能需要 10 多秒。
为了加快这个过程,我计划首先检查提交数据库,看看之前是否提交过等效代码。我意识到这将导致 Random 方法总是返回相同的结果,但这并不重要。是否有任何其他潜在问题可能是由于不运行代码而导致的?
为了找到匹配项,我在比较代码时删除了 cmets 和空格。但是,相同的代码仍然可以用不同的方式编写,例如使用不同的变量名。有没有办法比较代码可以找到更多等效代码?
【问题讨论】:
-
你更关心编译时间还是执行时间?根据语言,您可以存储编译后的字节码。
-
根据您的安全要求,这可能构成信息泄露漏洞;攻击者可以判断其他人是否提交了特定样本。这可能不是问题。
-
@SLaks,整个过程需要时间,所以我需要比较源代码,而不是字节码。信息披露在我的网站上不是问题。谢谢。
-
您可以将源代码映射到字节码
-
如果您想比较代码并检测以简单方式不同的情况(例如,变量被重命名),您需要一个了解代码结构的工具,什么是重要的(例如,不是空格)以及如何仅基于语言结构来检测差异。 “差异”不理解代码;它只理解线条,因此效果不佳。您可以查看我公司的 SmartDifferencer 源代码差异工具,该工具使用完整的解析器执行此操作,只关注结构上的差异。 SO不希望我发布链接;你必须仔细阅读我的简历。
标签: java ruby-on-rails database optimization static-analysis