给项目代码埋坑有哪些办法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
shmilypeter
V2EX    Java

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

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

    如何在项目中埋当时不会发作,离开了一两个月之后会逐渐发作并且还很难排查的 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 的方法导致丢数据、故意不处理一些可能出现异常的地方、多线程使用线程不安全的容器
    ltmst
        24
    ltmst  
       2023-09-22 08:35:47 +08:00   1
    你正常写就行了
    chendy
        25
    chendy  
       2023-09-22 08:41:14 +08:00
    一般程序员正常拉屎就能把后人恶心死了,不用多想
    9dP06m83vIV00l72
        26
    9dP06m83vIV00l72  
       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 包到私库
    多用存储过程
    GBdG6clg2Jy17ua5
        29
    GBdG6clg2Jy17ua5  
       2023-09-22 08:47:03 +08:00
    多引入一些自己的私有工具库。
    RainCats
        30
    RainCats  
       2023-09-22 08:47:20 +08:00   23
    @andytao 前面两句话还正常,第三句话暴露了屑老板的本性
    LuJason
        31
    LuJason  
       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
    把代码写得尽可能多或者尽可能少, 然后不写注释, 神仙难救.
    nxforce
        36
    nxforce  
       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 ,删库跑路是踩缝纫机的充分条件,不是必要条件。
    LieNoWell
        49
    LieNoWell  
       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 请求加定时器
    keepfun
        79
    keepfun  
       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
    先和老敬酒三杯,再. (三杯不喝十杯)

    喝完酒後,走路法走直,你的思也是,但是你察不到,得我醉,在醉酒和宿醉正常即可.
    Leeeeex
        91
    Leeeeex  
    PRO
       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     Solana     931 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 22:49 PVG 06:49 LAX 15:49 JFK 18:49
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86