V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shmilypeter
V2EX  ›  Java

给项目代码埋坑有哪些办法?

  •  
  •   shmilypeter ·
    chenqifeng92 · 2023-09-22 01:37:36 +08:00 · 12245 次点击
    这是一个创建于 427 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如何在项目中埋当时不会发作,离开了一两个月之后会逐渐发作并且还很难排查的 bug 呢?

    初步想到几个

    后端

    • 把全局变量变成私有;
    • 在注释中撒谎误导;
    • 更改日志级别然后将其上传到生产环境;

    数据库

    • 把日期类型改成字符串,然后照常 ORDER BY ;
    • 多用模糊查询让索引失效;
    • 更改某些定时任务插入数据的频率,快速塞满数据库;

    欢迎各位 V2EXer 补充,仅仅用作技术探讨,于此同时也可以避免 bug

    166 条回复    2023-09-27 10:29:52 +08:00
    1  2  
    kkk9
        1
    kkk9  
       2023-09-22 02:10:26 +08:00
    与其这样惹上官司不如直接删库跑路
    shmilypeter
        2
    shmilypeter  
    OP
       2023-09-22 02:28:48 +08:00
    @kkk9 如果你想踩缝纫机,删库跑路是最快的方式,并且,也没什么用。

    代码有版本控制不可能删掉,数据库大概率有备份,如果买的 RDS ,binlog 的备份粒度很可能是五分钟,你全库 drop 毫无损失。至于服务器,如果也是买的 ECS ,那肯定是有快照的。
    ufo5260987423
        3
    ufo5260987423  
       2023-09-22 03:04:10 +08:00   ❤️ 4
    讲个门槛高一点的:用元编程的思路写某一类业务——即给业务写一套 DSL ,然后把 DSL 的高阶逻辑做成宏的形式。这样在后面的开发中难免触发死循环还不好找死循环的原因,笑。
    jatsz
        4
    jatsz  
       2023-09-22 06:50:07 +08:00   ❤️ 4
    根据我调试的经验:
    1. 能上多线程,就上多线程。
    2. 能搞分布式(微服务), 就搞分布式.
    3. 按自己爽的方式写代码, 完全不考虑性能因素, 比如用一些高阶函数, 类似 <a list with few items *at first*>.foreach, x.map, etc.
    jatsz
        5
    jatsz  
       2023-09-22 06:51:25 +08:00   ❤️ 2
    再加一条:
    4. 增加依赖, 为了一个排序, 引入一个科学计算库.
    chaoschick
        6
    chaoschick  
       2023-09-22 06:52:58 +08:00 via Android
    switch 分支中少些几个 break
    levelworm
        7
    levelworm  
       2023-09-22 07:26:37 +08:00 via Android
    用不安全的方式加几个 exploitation
    yougg
        8
    yougg  
       2023-09-22 07:38:27 +08:00 via Android
    不要直接在经过你手的代码上动歪心思,commit log 追根溯源始终能找到你。

    -然而你可以试试供应链攻击-
    murmur
        9
    murmur  
       2023-09-22 07:41:11 +08:00   ❤️ 34
    加班写出来的代码不需要任何技巧全是坑
    wonderfulcxm
        10
    wonderfulcxm  
       2023-09-22 07:45:41 +08:00 via iPhone   ❤️ 1
    最重要的是有理有据,让人看不出你是故意的。😂
    laohucai
        11
    laohucai  
       2023-09-22 07:57:45 +08:00   ❤️ 1
    多依赖一些已经停更的第三方库就可以了!!
    muooOOO
        12
    muooOOO  
       2023-09-22 08:00:47 +08:00 via Android   ❤️ 3
    不用刻意添加,平时写出来的代码已经遍地都是坑了。
    ruanimal
        13
    ruanimal  
       2023-09-22 08:03:06 +08:00
    把所有新特性都用上,数据结构和算法都往复杂了搞,接口多封装几层
    xuanbg
        14
    xuanbg  
       2023-09-22 08:07:14 +08:00   ❤️ 2
    只要是复杂的逻辑不写注释,估计连你自己过几天都不会了。。。还要踩什么缝纫机

    当然,像我这样容易把复杂逻辑写简单的,就得刻意去做了。嗯这确实有点难度啊。。。不如随便找个能把简单逻辑写复杂的人替我写一下,这种人才我可以一抓一大把。
    Dispatcher
        15
    Dispatcher  
       2023-09-22 08:13:17 +08:00   ❤️ 9
    我一般是相信自己的实力,正常写代码就行。肯定都是坑。
    dangyuluo
        16
    dangyuluo  
       2023-09-22 08:14:04 +08:00
    写汇编
    chingyat
        17
    chingyat  
       2023-09-22 08:27:28 +08:00 via iPhone
    单线程的程序改成多线程,并且不加锁.
    SomeBodsy
        18
    SomeBodsy  
       2023-09-22 08:29:28 +08:00   ❤️ 23
    正常发挥就行了,不用刻意
    cookii
        19
    cookii  
       2023-09-22 08:32:56 +08:00 via Android
    最恶心的还是搞多线程,用事件去触发,把代码调用链路断开。
    Aboceder
        20
    Aboceder  
       2023-09-22 08:34:12 +08:00
    @chaoschick 你这在测试那一关就过不了吧
    jadelike
        21
    jadelike  
       2023-09-22 08:34:53 +08:00
    我一般是相信自己的实力,正常写代码就行。肯定都是坑。
    Aboceder
        22
    Aboceder  
       2023-09-22 08:35:01 +08:00
    @SomeBodsy 好一个正常发挥,哈哈哈啊哈哈,杀人诛心
    miniliuke
        23
    miniliuke  
       2023-09-22 08:35:03 +08:00
    写一些超出自己能力的偶发 BUG 代码:比如随便写个无锁并发容器、写个算法依赖时间增长的一旦机器时间自动同步程序就会出错。利用一些编程中容易混淆的错误:比如队列写入操作用数据满了直接返回 false 的方法导致丢数据、故意不处理一些可能出现异常的地方、多线程使用线程不安全的容器
    gbw1992
        24
    gbw1992  
       2023-09-22 08:35:47 +08:00   ❤️ 1
    你正常写就行了
    chendy
        25
    chendy  
       2023-09-22 08:41:14 +08:00
    一般程序员正常拉屎就能把后人恶心死了,不用多想
    andytao
        26
    andytao  
       2023-09-22 08:42:38 +08:00   ❤️ 2
    希望楼主记住这句话:玩火者,必自焚。

    你觉得工资和你的能力不匹配就换一家跟你匹配的嘛,真没必要故意搞这些事情。

    作为员工,要有老板(主人翁)意识:努力推进工作、思考创新解决办法,提升产品价值,一起做大蛋糕。
    cslive
        27
    cslive  
       2023-09-22 08:45:32 +08:00
    List<Map>梭哈
    twofox
        28
    twofox  
       2023-09-22 08:46:14 +08:00
    上传修改过的工具库 jar 包到私库
    多用存储过程
    angryfish
        29
    angryfish  
       2023-09-22 08:47:03 +08:00
    多引入一些自己的私有工具库。
    RainCats
        30
    RainCats  
       2023-09-22 08:47:20 +08:00   ❤️ 23
    @andytao 前面两句话还正常,第三句话暴露了屑老板的本性
    zh584728
        31
    zh584728  
       2023-09-22 08:47:34 +08:00
    1. 搞特殊的版本:用新特性 或者 用旧的已经被遗弃的特性
    2. 增加依赖,用一些不知名的模块
    zjp
        32
    zjp  
       2023-09-22 08:48:25 +08:00 via Android   ❤️ 1
    正常发挥就行
    tedzhou1221
        33
    tedzhou1221  
       2023-09-22 08:49:05 +08:00   ❤️ 1
    @cslive 我们公司的人日常都是 List<Map> 梭哈,这样公司就不能没有我们。哈哈
    chaoschick
        34
    chaoschick  
       2023-09-22 08:51:25 +08:00
    @Aboceder 既然我我说了这个例子 自然是在生产中遇到过
    wu67
        35
    wu67  
       2023-09-22 08:52:23 +08:00
    把代码写得尽可能多或者尽可能少, 然后不写注释, 神仙难救.
    joyhub2140
        36
    joyhub2140  
       2023-09-22 08:56:59 +08:00   ❤️ 1
    不用埋坑的,你把所有听说过的中间件往项目里面塞就行了,项目到最后没有多少人能接过来,知识量太大了。

    你还获得高高手得称号,这不美哉?
    Mystery0
        37
    Mystery0  
       2023-09-22 08:58:52 +08:00 via Android
    如果,自己没有离职,然后这堆代码线上出了问题,造成大的损失是不是后面要自己把这些坑一一填好?或者直接强行毕业没赔偿?
    bruce0
        38
    bruce0  
       2023-09-22 09:01:34 +08:00
    说一个 go 的, 返回一个 `var err *T` 这样的 error, 快的话,可能一眼就找到了,慢的话可能排查一天也查不出来, 尤其是在 多层函数调用的嵌套里
    chenPiMeiHaoChi
        39
    chenPiMeiHaoChi  
       2023-09-22 09:03:16 +08:00
    26 楼什么情况,一时分不出认真的还是反讽?
    Promtheus
        40
    Promtheus  
       2023-09-22 09:05:25 +08:00
    我觉得这是个有趣的想法,虽然看上去不太道德。但是往往资本家对你不道德的时候,又没人站出来了。
    Promtheus
        41
    Promtheus  
       2023-09-22 09:09:26 +08:00   ❤️ 1
    不过你这几个方法太刻意了 ,一下就查到了。要装的像是自己菜导致的,而不是故意这么写。我觉得比较简单的方法就是搜集下公司历年出的问题,然后照着写。一般这种问题都是运行好久才爆出来的。撑死了就是和前辈犯了一样的错而已
    liuidetmks
        42
    liuidetmks  
       2023-09-22 09:09:57 +08:00
    尽量使用新东西,边看 demo 边写那种
    wqhui
        43
    wqhui  
       2023-09-22 09:10:43 +08:00
    用 String 代替 enum ,多用 json\object\var ,时间久了没人敢保证自己知道里面究竟有什么东西
    devopsdogdog
        44
    devopsdogdog  
       2023-09-22 09:11:10 +08:00
    你能碰服务器或者版本包,你可以手动改代码 不提交 git 服务器。 这种是天花板了
    MaxmillianJ
        45
    MaxmillianJ  
       2023-09-22 09:13:40 +08:00   ❤️ 1
    @andytao 员工给蛋糕做大了,老板吃完抹嘴给留点渣不?
    Felldeadbird
        46
    Felldeadbird  
       2023-09-22 09:15:35 +08:00
    看你要埋的坑要具有多大的破坏了。推荐结合时间触发需求加逻辑判断。

    if( time > 2022-09-22 && 1 =1 )

    类似这种,1= 1 只是例子,现实中应该是一种业务判断,写代码有时候写等号会只写一个,导致判断恒久生效。

    switch 结构中漏写 break 也行。

    这种逻辑错误是直接影响公司正常运作的。属于隐性破坏。 当然了,要求写测试的团队一般有工具校验出这种问题。

    所以埋坑最终应该以自己实际情况自己整理合适的坑。
    Xbluer
        47
    Xbluer  
       2023-09-22 09:19:15 +08:00
    [把全局变量变成私有;]
    反掉了吧
    nothingistrue
        48
    nothingistrue  
       2023-09-22 09:19:59 +08:00
    @shmilypeter #2 1 ,如果你不想踩缝纫机,那就别干能导致你踩缝纫机的事。2 ,删库跑路是踩缝纫机的充分条件,不是必要条件。
    MrSheng
        49
    MrSheng  
       2023-09-22 09:21:30 +08:00
    不建议这么搞,没必要,以直报怨,以德报德。

    如果真想搞,那就把代码混淆一下,各语言都有方案,相信我,真的会吐
    yeccc
        50
    yeccc  
       2023-09-22 09:22:19 +08:00
    mongo TTL 索引
    Fule
        51
    Fule  
       2023-09-22 09:23:30 +08:00   ❤️ 4
    故意埋坑最终可能只有 5%影响到了你坑的人/组织,而 95%影响的只是和你一样的其他打工人。所以考虑下有无别的手段吧
    sky857412
        52
    sky857412  
       2023-09-22 09:23:53 +08:00
    服务启动时,启动一个后台线程跑任务,然后在特定数据情况下,线程挂掉,后台任务停止运行
    BeyondBouds
        53
    BeyondBouds  
       2023-09-22 09:26:55 +08:00
    公司没有 cr ,那可太简单,直接关键业务模块打包成静态库,源代码只有我有....
    hervey0424
        54
    hervey0424  
       2023-09-22 09:31:28 +08:00   ❤️ 1
    正常写代码就行了
    skiy
        55
    skiy  
       2023-09-22 09:31:46 +08:00 via iPhone
    ?结果苦的是下一个接手的同行。到时接手的同行,直接把坑往 v2 一发…又是一轮的口诛笔伐。
    ?往后的背调不打算过了?
    wuqi5920
        56
    wuqi5920  
       2023-09-22 09:31:49 +08:00
    @jatsz
    @shmilypeter 还用埋坑?方法不做拆分。直接一坨,if else 无限嵌套。注释不写,反正写了也没用
    shawnsh
        57
    shawnsh  
       2023-09-22 09:33:48 +08:00 via Android
    用 C++写,内存泄漏就够了
    thinkm
        58
    thinkm  
       2023-09-22 09:35:23 +08:00
    用人名作为变量名
    int peter = 3;
    double vincent = 1.0;
    Selenium39
        59
    Selenium39  
       2023-09-22 09:38:23 +08:00   ❤️ 2
    关键的条件判断处少写一个=号,合理
    dcsuibian
        60
    dcsuibian  
       2023-09-22 09:41:14 +08:00 via Android
    要我就不埋坑,何苦为难下个打工人
    mtw
        61
    mtw  
       2023-09-22 09:41:23 +08:00   ❤️ 1
    不提议这么做,但是技术方案很多,代码中各种宏,还有 goto 横飞。
    wu00
        62
    wu00  
       2023-09-22 09:43:36 +08:00
    为什么要主动去干这种事呢...
    我都是把能填的坑先填了,不能填的提前告知,不然会觉得丢人
    tabris17
        63
    tabris17  
       2023-09-22 09:44:18 +08:00
    所有代码写在一个文件里
    MozzieW
        64
    MozzieW  
       2023-09-22 09:44:36 +08:00   ❤️ 2
    之前公司出现过开发离职删了几个文件,的确过了几个月才发现问题,排查半天 Git 找到人。

    技术老大人好,内部告知一下捂住了,说人家还年轻。我估计会有人告诉那个开发。

    不然按照我们当时老板的性格,那个人警察上门少不了。

    供参考。
    sakae010
        65
    sakae010  
       2023-09-22 09:45:18 +08:00
    多用已经停更的或很老的第三方包就行
    me1onsoda
        66
    me1onsoda  
       2023-09-22 09:50:43 +08:00
    操作数据库。大多数情况账号权限混乱,不知道是谁操作的,把索引删了之类的
    WebKit
        67
    WebKit  
       2023-09-22 09:54:53 +08:00 via Android   ❤️ 1
    写开源库,然后你的项目引用🌚
    e9pWeUbh9PGCnp95
        68
    e9pWeUbh9PGCnp95  
       2023-09-22 10:20:45 +08:00
    闭着眼睛直接上多线程, 什么数据竞争, 什么内存一致性, 统统抛脑后.
    ma836323493
        69
    ma836323493  
       2023-09-22 10:21:43 +08:00
    能异步处理的全部放到线程里处理, 嵌套, 三行代码单独写一个方法写一个类, 设计模式满天飞, 策略模式和观察模式是最容易挖坑的, 另外反射也给他用上
    dna1982
        70
    dna1982  
       2023-09-22 10:22:59 +08:00   ❤️ 1
    “把全局变量变成私有”

    一看这第一句话就是外行写的。
    wednesdayco
        71
    wednesdayco  
       2023-09-22 10:24:41 +08:00
    java 的话试试这种
    // \u000d a="world";
    qiumaoyuan
        72
    qiumaoyuan  
       2023-09-22 10:28:01 +08:00   ❤️ 1
    正常写就行了,坑不会少,而且确实是无意的,很无辜。
    qiumaoyuan
        73
    qiumaoyuan  
       2023-09-22 10:30:10 +08:00
    “把全局变量变成私有”,感谢你对代码可读性的优化做出的努力。

    所以说正常写就行了。
    zidian
        74
    zidian  
       2023-09-22 10:30:29 +08:00
    在注释中撒谎误导;

    这不是每个项目都有的么
    token10086
        75
    token10086  
       2023-09-22 10:31:49 +08:00
    多用 go to 语句, 变量命名产考 OOoo0o 和 Il1LLll 等形式
    clf
        76
    clf  
       2023-09-22 10:35:36 +08:00
    想办法把磁盘塞满()
    jackmod
        77
    jackmod  
       2023-09-22 10:36:50 +08:00
    https://softwareengineering.stackexchange.com/q/18454
    单是这一条反着来就够后面的人喝几壶了。
    我因为面对这种代码加了很多工时(
    justin2018
        78
    justin2018  
       2023-09-22 10:38:45 +08:00
    1. 代码写成💩山

    2. 重复代码 ctrl+c 和 ctrl+v

    3. API 请求加定时器
    fenglangjuxu
        79
    fenglangjuxu  
       2023-09-22 10:40:38 +08:00
    把代码写的高级点 一般人看不懂 多用高级特性 别人不敢动
    MonkeyJon
        80
    MonkeyJon  
       2023-09-22 10:48:56 +08:00
    @jatsz #4 你这经验,真好
    RightHand
        81
    RightHand  
       2023-09-22 10:51:34 +08:00 via Android
    看组内技术如何,多用设计模式,突然离职。故意埋坑容易被发现,多用设计模式是正当优化
    opengps
        82
    opengps  
       2023-09-22 10:53:00 +08:00
    好像有个 github 项目就是这么搞的
    pengtdyd
        83
    pengtdyd  
       2023-09-22 10:53:58 +08:00
    把注释删掉就可以了,可以开发一个插件一键删除所有注释
    yousabuk
        84
    yousabuk  
       2023-09-22 10:54:27 +08:00 via iPhone
    当然是:数据溢出,内存溢出,条件性的(漏判)进入死循环,条件性的内存非法引用了。
    RightHand
        85
    RightHand  
       2023-09-22 10:55:19 +08:00 via Android
    @RightHand 你要相信至少 90%的人是不会/用错设计模式的,再加上奇葩的需求迭代,一定会爆炸
    cstj0505
        86
    cstj0505  
       2023-09-22 11:07:56 +08:00   ❤️ 1
    @jatsz 上多线程,还用锁和共享变量来控制并发,哈哈,不用埋,都是坑
    poorcai
        87
    poorcai  
       2023-09-22 11:09:04 +08:00
    @SomeBodsy #18 笑死哈哈哈哈,虾仁猪心啊
    wangxin13g
        88
    wangxin13g  
       2023-09-22 11:10:56 +08:00
    少写注释,在 java 里用科里化,多用 Map<String,Object>
    Courstick
        89
    Courstick  
       2023-09-22 11:16:03 +08:00
    @opengps #82 evil.js ?
    shyangs
        90
    shyangs  
       2023-09-22 11:28:59 +08:00
    先和老闆敬酒三杯,再寫. (三杯不夠喝十杯)

    喝完酒後,走路無法走直線,你的邏輯思維也是,但是你卻察覺不到,會覺得我沒醉,在醉酒和宿醉狀態正常發揮即可.
    chanChristin
        91
    chanChristin  
       2023-09-22 11:36:27 +08:00
    zypy333
        92
    zypy333  
       2023-09-22 12:25:35 +08:00
    不要用任何第三方库,全自己写
    hyperbin
        93
    hyperbin  
       2023-09-22 12:28:41 +08:00 via Android
    正常写就行(doge
    Features
        94
    Features  
       2023-09-22 12:51:54 +08:00
    国内的话,写个代码,每个月随机几天,200 个线程,超时时间 10 秒,每 100 毫秒请求一次谷歌
    IO 问题基本不占用 CPU ,不占用内存,很难排查
    learningman
        95
    learningman  
       2023-09-22 12:52:51 +08:00
    Java 全部 Object ,C 全部 void*,要用的时候再 cast
    join
        96
    join  
       2023-09-22 12:53:45 +08:00
    用 rust 或 c++即可。
    wyl986
        97
    wyl986  
       2023-09-22 13:19:32 +08:00
    你就正常发挥
    sprite82
        98
    sprite82  
       2023-09-22 13:29:10 +08:00
    你可能想找的是这个,但是你要是这么做了,可能是自己承担这个后果。写少了,没什么影响,写多了,肯定大骂哪个鲨笔写的,一看 git 记录:哦,是我写的 🤡

    https://github.com/trekhleb/state-of-the-art-shitcode
    shmilypeter
        99
    shmilypeter  
    OP
       2023-09-22 13:55:10 +08:00 via iPhone
    @Promtheus 对,我的意思就是第一要伪装成自己菜导致的,第二要过一段时间才会有很难排查的,并且也影响业务的后果。
    Leung818
        100
    Leung818  
       2023-09-22 14:07:34 +08:00
    @SomeBodsy 哈哈哈哈哈哈😂你是可以的
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 06:17 · PVG 14:17 · LAX 22:17 · JFK 01:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.