2

大多数程序员都有调试/修复别人代码的经验。有时,“别人的代码”是如此的模糊,以至于试图理解它在做什么已经够糟糕的了。

您必须调试/修复的最糟糕(最模糊)的代码是什么?

如果你没有把它扔掉并从头开始重新编码,那你为什么不呢?

4

12 回答 12

10

PHP OSCommerce 足以说,它是混淆代码......

于 2009-04-19T09:55:13.493 回答
6
  • 一个Java类
  • 仅操作 DOM 的静态方法
  • 8000 个 LOC
  • 在“错误”时返回 null 的长链方法:ab().c().d().e()
  • 非常长的方法(每个方法 400/500 LOC)
  • 嵌套 if,while,如:

    if (...) {
      for (...) {
        if (...) {
          if (...) {
            while (...) {
              if (...) {  
    
  • 面向剪切和粘贴的编程

  • 没有异常,所有异常都被捕获并使用 printStackTrace() “处理”
  • 没有单元测试
  • 没有文件

我很想扔掉并重新编码......但是,经过 3 天的艰苦调试,我已经添加了魔法如果:-)

于 2009-04-19T11:40:07.530 回答
2

意大利面条代码 PHP CMS 系统。

于 2009-04-19T09:52:46.680 回答
2

默认情况下,程序员认为别人的代码被混淆了。

我可能不得不做的更糟糕的事情是用一个简单的方法解释变量 i1、i2 j、k、t 是什么,它们不是“for”循环中的计数器。

在所有其他情况下,我猜问题区域很困难,这使得代码看起来很困难。

于 2009-04-19T11:56:54.557 回答
2

我今天在我们的代码库中发现了这行代码,并认为这是偷偷摸摸混淆的一个很好的例子:

if (MULTICLICK_ENABLED.equals(propService.getProperty(PropertyNames.MULTICLICK_ENABLED))) {} else {
    return false;
}

只要确保我阅读了整行。没有略读。

于 2011-06-08T09:30:54.997 回答
1

在处理 GWT 项目时,我会接触到不属于我的 GWT 编译的混淆 JS 代码的一部分。

现在祝你调试真正的混淆代码好运。

于 2009-04-19T10:00:52.123 回答
1

我不记得完整的代码,但它的一部分仍然留在我的记忆中,因为我花了几个小时试图理解:

do{
  $tmp = shift unless shift;
  $tmp;
}while($tmp);

起初我无法理解它,它看起来很没用,然后我打印出@_ 用于参数列表,一系列交替的布尔和函数名称,该代码与一个库检测模块结合使用,如果它改变了行为一个函数被破坏了,但是代码的文档记录很糟糕,而且如果没有完全理解完整的代码就没有任何意义,我放弃并重写了整个代码。


来自 DVK 的更新:

而且,以免有人声称这是因为 Perl 是不可读的,而不是编码器是高尔夫大师而不是优秀的软件开发人员,这里是相同的代码,其混淆形式稍微少一些(真正正确的代码甚至没有交替的子名称和布尔值首先:)

# This subroutine take a list of alternating true/false flags
# and subroutine names; and executes the named subroutines for which flag is true.
# I am also weird, otherwise I'd have simply have passed list of subroutines to execute :)
my @flags_and_sub_names_list = @_;
while ( @flags_and_sub_names_list ) {
    my $flag     = shift @flags_and_sub_names_list; 
    my $subName  = shift @flags_and_sub_names_list;
    next unless $flag && $subName;
    &{ $subName }; # Call the named subroutine
}
于 2009-11-07T16:25:00.653 回答
0

我有一个 300 行函数执行输入清理的案例,它错过了某个角落案例。它使用 IndexOf 和 Substring 以及许多内联变量和常量手动解析某些情况(看起来原始编码器对良好实践一无所知),并且没有提供任何评论。由于时间限制以及我没有所需的规范,因此将其扔掉是不可行的,因此重写它意味着理解原件,但在理解它之后修复它会更快。我还加了很多评论,所以谁来找我看都不会觉得一样的痛苦……

于 2009-04-19T09:53:32.780 回答
0

Perl 声明:

select((select(s),$|=1)[0])

在原作者(Randal Schwartz 本人,他说他不喜欢它,但当时没有其他可用的)的建议下,它被替换为更容易理解的东西:

IO::Handle->autoflush

除了这一行之外,IBM 的一些 Java JDBC 库被混淆了,所有变量和函数要么是字母“l”和“1”的组合,要么是单/双字符——在你得到它们之前很难追踪任何东西都改名了。需要这样做来追踪为什么他们在 IBM 的 JRE 中运行良好,但在 Sun 的运行良好。

于 2009-04-19T11:48:53.047 回答
0

如果您在谈论 HLL 代码,一旦我更新由中国人编写的项目并且所有评论都是中文的(存储在 ansii 中)并且理解一些代码片段是一种恐惧,如果您谈论的是低级代码,那么有其中许多(混淆,变异,vm-ed ...)。

于 2009-11-07T16:04:49.103 回答
0

我曾经不得不对一个 Java 1.1 框架进行逆向工程:

  1. 为每个类扩展了事件驱动的 SAX 解析器类,甚至那些不解析 XML 的类(被覆盖的方法只是由其他代码临时调用)
  2. 尽可能抛出自定义运行时异常来代替方法调用。结果,大部分业务逻辑都落在了嵌套的一系列catch块中。

如果我不得不猜测,这可能是某人的“聪明”想法,即在 Java 1.1 中方法调用代价高昂,因此为非异常流控制抛出异常在某种程度上被认为是一种优化。

用了大约三瓶眼药水。

于 2009-11-07T16:19:28.700 回答
0

我曾经发现一个被故意混淆的定时炸弹。

当我终于破译了它在做什么时,我向经理提到了它,他们说他们知道定时炸弹,但因为它非常无效并且与其他代码交织在一起而将其留在原处。

定时炸弹(大概)应该在某个日期之后引爆。

相反,它有一个错误,因此只有在 12 月 31 日午餐时间之后有人工作时才会激活它。

从那个写定时炸弹的家伙离开公司到现在,这种情况已经过了三年。

于 2011-10-09T15:47:42.387 回答