搜索
bottom↓
回复: 104

如何针对糟糕的代码进行安全重构

  [复制链接]

出0入0汤圆

发表于 2018-8-23 14:20:32 | 显示全部楼层 |阅读模式
最近在公司接手一位已离职工程师的项目,整个项目的代码看得我脑袋都要炸裂了:
2000+的函数;
动不动就是5到6层的嵌套,if里面套switch,switch里面再套if,if里面再套....;
漫天飞舞的全局变量
错综复杂的逻辑表达式,真的好难看懂!

不能把整个项目代码贴出来,我贴个截图感受一下:



请问各位大佬,有没有好的方式对整个代码重构,主要从哪几点着手?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-8-23 14:20:33 | 显示全部楼层
不要一开始还就重构
我觉得先从一个你最熟悉的模块入手,先把代码增强可读性并风格一致,然后逐步扩散到周边模块,用一两年的时间逐步完成,最后实现重构。

出0入8汤圆

发表于 2018-8-23 14:23:12 | 显示全部楼层
哦。变量名称还算友好吧。 如果是换成S1,S2,S3之类的岂不是更抓狂?看不惯,并且有能力就重写呗。

出0入0汤圆

发表于 2018-8-23 14:23:31 | 显示全部楼层
按业务逻辑直接重写

出0入4汤圆

发表于 2018-8-23 14:27:27 | 显示全部楼层
tongdayusu 发表于 2018-8-23 14:23
哦。变量名称还算友好吧。 如果是换成S1,S2,S3之类的岂不是更抓狂?看不惯,并且有能力就重写呗。 ...

我前同事就是S1,S2...满屏乱飞,读他的程序真的需要勇气,而且注释很少,他自己有时候都得从头开始想

出0入42汤圆

发表于 2018-8-23 14:29:26 | 显示全部楼层
旧程序没出问题的时候,LZ自己重构,以后出的所有问题老板都会认为是LZ乱改改出来的

LZ如果想重构,必须先完全看懂旧程序。如果有Bug,就找出触发Bug的条件,然后现场演示,这样就有理由改了;如果没有Bug,就忍住不要改

出0入0汤圆

发表于 2018-8-23 14:41:12 | 显示全部楼层
很同情楼主  都是这样过来的

出0入0汤圆

发表于 2018-8-23 14:41:55 | 显示全部楼层
tongdayusu 发表于 2018-8-23 14:23
哦。变量名称还算友好吧。 如果是换成S1,S2,S3之类的岂不是更抓狂?看不惯,并且有能力就重写呗。 ...

s1,s2也还好,曾看过代码类似(凭记忆来的):
a = c;
b = d;
if(a==d)
{
     b = f;
}

你该怎么搞

出0入8汤圆

发表于 2018-8-23 14:46:18 | 显示全部楼层
liurangzhou 发表于 2018-8-23 14:41
s1,s2也还好,曾看过代码类似(凭记忆来的):
a = c;
b = d;

只有更差,没有最差。

出0入4汤圆

发表于 2018-8-23 14:48:40 | 显示全部楼层
变量命名还算友好

出0入0汤圆

发表于 2018-8-23 14:49:34 | 显示全部楼层
楼主知足吧,你见过5000多行的代码在一个main.c里的么?重要的是还没啥封装,你这个起码还有宏定义,我见过的那个里面就是1,2,3,0x55

出0入0汤圆

发表于 2018-8-23 14:51:03 | 显示全部楼层
用宏定义把长串的东西变成短的,也许可以更方便看程序
#define 条件1 ((a>b)&&(c>d))
#define 条件2 ((e>f)&&(g>h))

if(条件1 || 条件2)
{
}

出0入0汤圆

发表于 2018-8-23 14:51:23 | 显示全部楼层
看过比你这个更烂的代码,先熟悉业务逻辑。

出0入42汤圆

发表于 2018-8-23 14:53:38 | 显示全部楼层
lnskngdc 发表于 2018-8-23 14:49
楼主知足吧,你见过5000多行的代码在一个main.c里的么?重要的是还没啥封装,你这个起码还有宏定义,我见过 ...

5000多行?这算好的了。。



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-8-23 15:04:36 | 显示全部楼层
首先,你要清楚需求和实现原理

出0入0汤圆

 楼主| 发表于 2018-8-23 15:11:00 | 显示全部楼层
3DA502 发表于 2018-8-23 14:58
不要动,一行也不要动

需求变了,不动不行!

出30入54汤圆

发表于 2018-8-23 15:11:37 | 显示全部楼层
代码吓人,不过重构前要想好,不然结构再好的代码不能用也是垃圾一堆

出0入0汤圆

 楼主| 发表于 2018-8-23 15:11:49 | 显示全部楼层
wshtyr 发表于 2018-8-23 14:53
5000多行?这算好的了。。

你这个,我内心是崩溃的.

出0入0汤圆

 楼主| 发表于 2018-8-23 15:13:16 | 显示全部楼层
lnskngdc 发表于 2018-8-23 14:49
楼主知足吧,你见过5000多行的代码在一个main.c里的么?重要的是还没啥封装,你这个起码还有宏定义,我见过 ...

我这个里面也有好多魔数啊,120,90,30等

出0入0汤圆

 楼主| 发表于 2018-8-23 15:15:22 | 显示全部楼层
wshtyr 发表于 2018-8-23 14:29
旧程序没出问题的时候,LZ自己重构,以后出的所有问题老板都会认为是LZ乱改改出来的

LZ如果想重构,必须先 ...

这个需求有变,必须要改了.而且这个程序是没有量产的程序,里面不知道有什么bug在里面.脑仁痛.

出0入0汤圆

 楼主| 发表于 2018-8-23 15:16:51 | 显示全部楼层
JasonGao 发表于 2018-8-23 14:23
按业务逻辑直接重写

这个有时间倒是可以做一下.

出0入0汤圆

发表于 2018-8-23 15:18:01 | 显示全部楼层
维护代码,重构与否还是重新来过,前提都要先熟悉业务逻辑!

出0入46汤圆

发表于 2018-8-23 15:34:58 | 显示全部楼层
这个看着像个状态机,拿一张大纸,照着程序画出来看看。估计没有你说的那么复杂混乱。

出0入0汤圆

发表于 2018-8-23 15:41:34 | 显示全部楼层
建议楼主,先把那些长的判断用宏定义成短的名称,然后一个个替换掉,然后再组合起来,就可以一步步重构了

出0入42汤圆

发表于 2018-8-23 15:53:07 | 显示全部楼层
一般来说,每个人都认为自己是最牛逼的。

出0入0汤圆

发表于 2018-8-23 15:54:51 | 显示全部楼层
首先得懂了才能改,有些看起来无用的其实很有用

出0入0汤圆

发表于 2018-8-23 15:54:54 | 显示全部楼层
把逻辑关系先理清吧,然后确认功能,再重写,可能就是最快的。
曾经对着汇编代码一点一点理逻辑关系,然后C重写的

出110入0汤圆

发表于 2018-8-23 15:55:42 | 显示全部楼层
这个前任已经不算很坑了啊

楼主位这个代码整理一下格式,会看起来轻松一些

没有确认bug就重构,估计以后场面会很尴尬

出95入100汤圆

发表于 2018-8-23 15:57:17 | 显示全部楼层
先把代码格式化一下再说吧

出0入0汤圆

发表于 2018-8-23 16:10:16 | 显示全部楼层
看没有注释的代码是痛苦的,但是很多人写代码的时间就是不爱加注释......

出0入0汤圆

发表于 2018-8-23 16:16:07 | 显示全部楼层
说实话这个代码写的还是有点规范的。

出0入0汤圆

发表于 2018-8-23 16:16:08 | 显示全部楼层
逻辑有点多,但代码并不乱,
如果内存够,先把u8 u16之类的前缀去掉,统一换成u16,或者u32会整洁很多

出0入0汤圆

发表于 2018-8-23 16:22:34 | 显示全部楼层
lnskngdc 发表于 2018-8-23 14:49
楼主知足吧,你见过5000多行的代码在一个main.c里的么?重要的是还没啥封装,你这个起码还有宏定义,我见过 ...

我手头上正好有个7000多行的main.c

出0入46汤圆

发表于 2018-8-23 16:24:12 | 显示全部楼层
你这个还算好的,我接手的更乱,代码比这个乱,编译下来一点多个警告,客户需求也很乱改了好多个版本也没什么文件。

出0入0汤圆

发表于 2018-8-23 16:37:08 | 显示全部楼层
JasonGao 发表于 2018-8-23 16:22
我手头上正好有个7000多行的main.c

10年前的代码风格啊

出0入0汤圆

发表于 2018-8-23 16:40:28 | 显示全部楼层
以前为了优化代码,都是晚上在家弄得,不敢耽误单位发货。
花了一个多月,弄利索了,很多模块,现在都在用。

出0入0汤圆

发表于 2018-8-23 16:41:17 | 显示全部楼层
这个代码已经很规范了啊! 我见过的有前辈写成这样的:
unsigned int i=0,i4=0,i5=0,i6=0;
unsigned int c=0;
unsigned int c1=60; //60度
unsigned int c2=0;
unsigned char d=0,d1=0,d2=0,d3=0;
unsigned char e=0;
unsigned char f=0;
unsigned char g=0;
unsigned char e1=0;
unsigned char x[3];
unsigned char i1=0,i2=0,i3=0;
unsigned char n1=0,n2=0,n3=0,n4=0,n5=0,n6=0,n7=0,n8=0,n9=0,n10=0,n11=0,n12=0,n13=0,n14=0;
unsigned int m5=0,m6=0,m9=0;

  if(d==0)
  {P2=P2&0x7F;}

   if(e==1&&f==0)
    {P2=P2&0x7F;}
   if(e==1&&g==0)
    {P2=P2&0x7F;}
   
    delayms(6);

//    P2=0xFD;   //1
    sled_com2=0;  sled_com1=1;  sled_com3=1;  Beep=1; //1
        P1=b[i2];
  
   if(f==0||g==0)
    {P2=P2&0x7F;}
   
  if(d==0)
   {P2=P2&0x7F;}

   if(e==1&&f==0)
    {P2=P2&0x7F;}
   if(e==1&&g==0)
    {P2=P2&0x7F;}
   
    delayms(6);

//    P2=0xFB;   //1
    sled_com2=1;  sled_com1=0;  sled_com3=1;  Beep=1; //1
        P1=a[i1];
    delayms(1);
  
     }

出0入0汤圆

发表于 2018-8-23 17:08:03 | 显示全部楼层
祖传代码是不能随便乱动的

出0入0汤圆

发表于 2018-8-23 17:24:19 | 显示全部楼层
楼主已经很幸福了,手里现在还在维护着一个板两个MPU的,一个几乎满64K,一个30多K,全是汇编,且从头到尾没注释的。

出0入0汤圆

发表于 2018-8-23 17:28:04 | 显示全部楼层
先批量改动变量名、函数名、文件名,根据功能整理一下,这个应该不容易出错。
整理完易读性会提高一档,再来考虑下一步。

出0入0汤圆

发表于 2018-8-23 17:30:01 | 显示全部楼层
liurangzhou 发表于 2018-8-23 14:41
s1,s2也还好,曾看过代码类似(凭记忆来的):
a = c;
b = d;

aaa,bbb,ccc

出0入0汤圆

发表于 2018-8-23 17:30:21 | 显示全部楼层
有的代码看的真的是非常想重写。

我今年趁着换芯片都重写了好些个项目了。

不过现在2000行的代码应该都算少了的吧。

我这里好些个机子代码量都好高。

代码结构做好来,维护都好维护,移植也轻松。

出0入0汤圆

发表于 2018-8-23 17:32:11 | 显示全部楼层
哦。LZ一个函数2000行。牛逼  哈哈

出0入0汤圆

发表于 2018-8-23 17:57:37 | 显示全部楼层
没量产的代码,还是先完整测试下先,如果前任还在,倒是可以问问

出0入0汤圆

发表于 2018-8-23 18:00:24 | 显示全部楼层
这代码算好了的吧,名字起的还是比较规范的,如果全给你随便起一个名字,那时破解每个变量名含义都够呛的

出10入12汤圆

发表于 2018-8-23 18:13:32 | 显示全部楼层
我有前辈是  i,ii,iii, j,jjj jj,k,kk,aa,

出0入0汤圆

发表于 2018-8-23 18:15:38 | 显示全部楼层
ndt2000 发表于 2018-8-23 17:24
楼主已经很幸福了,手里现在还在维护着一个板两个MPU的,一个几乎满64K,一个30多K,全是汇编,且从头 ...

64K汇编,niubility~~~

出0入0汤圆

发表于 2018-8-23 18:18:01 | 显示全部楼层
这代码写的还是很规范的。
写流水灯代码是不需要这么复杂的。

出0入0汤圆

发表于 2018-8-23 18:20:50 | 显示全部楼层
我觉得代码写的还是不错的,不要注释也能看懂大概
这个写代码的工程师,应该工作好几年了的,不是一般菜鸟写出来的代码

出0入0汤圆

发表于 2018-8-23 18:59:08 | 显示全部楼层
很多年轻人一上来就喜欢喷前任的代码如何如何烂,这是不成熟的表现

出0入0汤圆

发表于 2018-8-23 19:02:18 来自手机 | 显示全部楼层
一个字都不要动

出20入62汤圆

发表于 2018-8-23 19:36:03 | 显示全部楼层
这比我写的好。我写的我自己都看不懂。现在每次都加一堆注释,怕给未来的自己挖坑。

出0入0汤圆

发表于 2018-8-23 20:11:52 | 显示全部楼层
superAFE 发表于 2018-8-23 14:39
触发出现bug再重写。

高,实在是高

最可怕的是,很多人重构后,发现还不如以前的,写的更烂了。。但问题很多。。因为有很多自以为是的工程师,以为不符合他们审美观或撰写格式的就要重构。



出40入42汤圆

发表于 2018-8-23 20:27:09 | 显示全部楼层
一切重构请在熟悉逻辑业务之后再着手开始,否则屁都不要放一个。。

出0入0汤圆

发表于 2018-8-23 21:13:45 | 显示全部楼层
重构没有安全的,除非投入巨大人力成本。

出0入0汤圆

发表于 2018-8-23 21:16:38 来自手机 | 显示全部楼层
代码就是要让人家看不懂

出140入115汤圆

发表于 2018-8-23 21:18:38 | 显示全部楼层
lcw_swust 发表于 2018-8-23 14:51
用宏定义把长串的东西变成短的,也许可以更方便看程序
#define 条件1 ((a>b)&&(c>d))
#define 条件2 ((e>f) ...

高!这招楼主可以试试。

出0入0汤圆

发表于 2018-8-23 21:31:52 | 显示全部楼层
选择性重构,
1, 先分析功能,然后把确认相同功能的代码重新封装,
2.  通过上面走了一遍程序,基本流程应该搞懂了,然后就是自己发挥了!

出0入0汤圆

发表于 2018-8-23 22:10:06 | 显示全部楼层
先消化熟悉代码,才有修改资格

出870入263汤圆

发表于 2018-8-23 23:02:42 | 显示全部楼层
最可怜这种给别人擦屎的事。清楚了业务逻辑之后,重新实现吧!

出0入0汤圆

发表于 2018-8-23 23:21:11 来自手机 | 显示全部楼层
虽然贴出来的代码不多,但从变量名的命名来看,写得很规范。楼主还是多看看前辈为什么要这样写吧

出0入0汤圆

 楼主| 发表于 2018-8-24 08:24:09 | 显示全部楼层
luhuaren 发表于 2018-8-23 18:59
很多年轻人一上来就喜欢喷前任的代码如何如何烂,这是不成熟的表现


恩恩,我水平没到!受教了.

出0入0汤圆

发表于 2018-8-24 08:36:09 | 显示全部楼层
赶紧撤吧,烂尾缠身,万劫不覆

出0入8汤圆

发表于 2018-8-24 08:51:42 | 显示全部楼层
给你王垠的一篇文章:『什么是现实理想主义者』
看看他是怎么对待别人的代码的。

出0入0汤圆

发表于 2018-8-24 09:45:48 | 显示全部楼层
光理顺这些代码的时间 ,我想重写都够了

出0入0汤圆

发表于 2018-8-24 09:54:55 | 显示全部楼层
这种代码,公司以前的 leader 为什么没有审查到?

出0入0汤圆

发表于 2018-8-24 10:06:48 | 显示全部楼层
佩服重构的勇气!
一般不建议重构,再怎么烂,那也是经过测试验证的。重构的话,那又要一帮人陪你玩!

出5入14汤圆

发表于 2018-8-24 10:25:36 | 显示全部楼层
coleyao 发表于 2018-8-23 16:41
这个代码已经很规范了啊! 我见过的有前辈写成这样的:
unsigned int i=0,i4=0,i5=0,i6=0;
unsigned int c= ...

你确定这个代码不是被“篡改”过变量名后才给你的 ???

我就遇到过,本来代码写得挺好的,辞职移交时被改得变量名面目全非、还胡乱改注释,,,偏偏又不影响编译运行,只是苦了接手的兄弟,,,

出0入8汤圆

发表于 2018-8-24 11:07:16 | 显示全部楼层
EMC菜鸟 发表于 2018-8-24 10:25
你确定这个代码不是被“篡改”过变量名后才给你的 ???

我就遇到过,本来代码写得挺好的,辞职移交时 ...

人品有问题,
不过要是早用上版本控制系统的话,就没这烦恼了。

出0入0汤圆

发表于 2018-8-24 11:18:58 | 显示全部楼层
ysu_er 发表于 2018-8-23 21:16
代码就是要让人家看不懂

+1,撇开正义道德的话,代码让人看懂,自己就没什么价值,在公司里边就没地位,所以核心的算法要写得别人看不出,并且无法改。

出0入0汤圆

发表于 2018-8-24 11:22:51 来自手机 | 显示全部楼层
xinjin 发表于 2018-8-24 11:18
+1,撇开正义道德的话,代码让人看懂,自己就没什么价值,在公司里边就没地位,所以核心的算法要写得别人 ...

我刚工作时,跟你想法一样。后来就呵呵了。

出0入0汤圆

发表于 2018-8-24 23:00:34 | 显示全部楼层
wshtyr 发表于 2018-8-23 14:53
5000多行?这算好的了。。

哈哈。。。笑了

出0入0汤圆

发表于 2018-8-24 23:06:18 | 显示全部楼层
这个代码写的我觉得很好了

出0入0汤圆

发表于 2018-8-25 16:05:28 来自手机 | 显示全部楼层
这个代码说实话已经比较规范了,命名就很不错

出0入0汤圆

发表于 2018-8-25 18:44:40 | 显示全部楼层
zhangfeibao 发表于 2018-8-23 15:11
需求变了,不动不行!

重构需谨慎,多数情况下重构都是件吃力不讨好的工作。
如果你是这个今后这个项目的长期负责人,并且可以hold全场,可以在公开场合提出理由重构。
不然还是忍一忍。
改需求改的地方少的话就在原有基础上改。
多的话就另起炉灶,新老并存。然后看时机慢慢过渡就好了。

出0入0汤圆

发表于 2018-8-25 18:51:03 | 显示全部楼层
xinjin 发表于 2018-8-24 11:18
+1,撇开正义道德的话,代码让人看懂,自己就没什么价值,在公司里边就没地位,所以核心的算法要写得别人 ...

后来你自己也看不懂了,还遭骂受排挤,更没地位

牛X的代码是:我写的很清楚,但是你就是看不懂;即便你看懂了你也没理由/没本事改动。

出0入0汤圆

发表于 2018-8-25 22:00:01 | 显示全部楼层
有過類似經歷。
同事做的產品需要增加通訊功能,但是該同事已經離職,然後就叫我們在之前代碼的基礎上添加功能,要求完成時間是半個月后。
等到代碼傳到傳過來打開一看立馬就蒙了----大約8000+的代碼,無數的全局變量和位定義,而且很多變量的名字是諸如:a; aa; aaa; b; bb;  bbb等,而且幾乎沒有注釋!
表示無法看懂需要重寫否則無法在短時間內完成后領導很生氣,埋怨我們不願意看別人代碼喜歡重寫浪費時間!

出0入0汤圆

发表于 2018-8-25 22:08:34 | 显示全部楼层
xinjin 发表于 2018-8-24 11:18
+1,撇开正义道德的话,代码让人看懂,自己就没什么价值,在公司里边就没地位,所以核心的算法要写得别人 ...

这样的同事好利害,好佩服,当然是要开了他!难道留着发年终奖

出615入1076汤圆

发表于 2018-8-25 22:34:37 | 显示全部楼层
本帖最后由 dukelec 于 2018-8-25 23:10 编辑

上家公司,做工業伺服電機的中年傢伙,我接手他的代碼,然後震驚了。。。

先看左邊,283 到 288 行,爲了把 char 型的四個字節轉成一個 int 型,他定義了一堆中間變量。。。
(注:scinum8to161 要理解爲 scinum8to16_1,先把 8 位 轉 16 位,再把 16 位轉 32 位。。。)



右邊升級了,可以直接 8 位 轉 32 位了。。。

全篇的全局變量,相似的命名(不同大小寫的各種組合各來一份)等等。。。
代碼對齊這麼高的要求就更加不指望了。。。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2018-8-26 08:48:47 | 显示全部楼层
楼主位的已经不算太差,可能也不只是上一任的问题,还有很多前任一代一代传承下来的。

出0入0汤圆

 楼主| 发表于 2018-8-27 17:53:38 | 显示全部楼层
security 发表于 2018-8-24 08:51
给你王垠的一篇文章:『什么是现实理想主义者』
看看他是怎么对待别人的代码的。 ...

文章写的很好!受教了

出0入42汤圆

发表于 2018-8-27 21:14:06 | 显示全部楼层
这个代码还可以, 不算乱的.

出0入42汤圆

发表于 2018-8-27 21:16:54 | 显示全部楼层
xinjin 发表于 2018-8-24 11:18
+1,撇开正义道德的话,代码让人看懂,自己就没什么价值,在公司里边就没地位,所以核心的算法要写得别人 ...

你如果在我这里, 恐怕是第一个要被开掉的人

出0入90汤圆

发表于 2018-8-28 01:45:31 | 显示全部楼层
我上家公司,一开始拿到的是日本电装发过来的代码,铃木的一款汽车仪表的代码。
我觉得代码写的就是一坨屎,命名都是什么u1,u2开头的。代码结构也很复杂。
但是等我逐渐看懂了之后,我发现别人都是遵守了misra2004这样的标准规范,然后程序都是模块化,分层,一层一层的,非常有条理。
然后我又觉得别人代码写得很吊。
一个蜂鸣器代码分成几十个文件,几万行代码。非常的有条理。

所以有时候觉得别人代码不好,如果别人的代码命名有规范,书写也有规范,结构上面也有规范的话,可能是你自己太菜了,才会觉得不爽。

出0入0汤圆

发表于 2018-8-28 08:38:47 来自手机 | 显示全部楼层
看了一段时间linux内核代码就觉得其它风格都不爽,特别各种大小写滥用的,比如大写的数据类型和小写的宏定义。

出30入54汤圆

发表于 2018-8-28 10:38:53 | 显示全部楼层
honami520 发表于 2018-8-28 01:45
我上家公司,一开始拿到的是日本电装发过来的代码,铃木的一款汽车仪表的代码。
我觉得代码写的就是一坨屎 ...

misra2004,学习了!有空我也要看看标准都是怎么约定的,闭门造车自以为是只能做井底之蛙

出0入0汤圆

发表于 2018-8-28 11:03:03 | 显示全部楼层
这代码逻辑够清晰了.

出0入45汤圆

发表于 2018-8-28 11:35:14 | 显示全部楼层
dukelec 发表于 2018-8-25 22:34
上家公司,做工業伺服電機的中年傢伙,我接手他的代碼,然後震驚了。。。

先看左邊,283 到 288 行,爲了 ...

你这个太麻烦了。
如果你的数组和32位内存模式一样,可以直接强制转换。
如果不一致。用联合体更简单

union
{
    BYTE buf[4];
    int  val;
}Val;

Val.buf[0] = 1;
Val.buf[1] = 2;
Val.buf[2] = 3;
Val.buf[4] = 4;

int temp = Val.val;

出0入0汤圆

发表于 2018-8-28 11:50:29 | 显示全部楼层
公司建立自己的代码规范标准啊,让大家都遵循这个规则玩,push到server的代码,一定要经过几个人的review,修改完comment后才入库。

出0入0汤圆

发表于 2018-8-28 11:56:09 | 显示全部楼层
找规律,目前来看命名上起码还是OK的。
其次,问题是你为啥要重构,出BUG了吗?针对BUG部分修改或者打补丁
重构除非你已经熟悉并评估过了这一部分功能或者这一个产品才开始动手。
重构不是坏事,也不是好事,看情况来吧

出20入26汤圆

发表于 2018-8-28 12:29:40 | 显示全部楼层
myiccdream 发表于 2018-8-28 11:35
你这个太麻烦了。
如果你的数组和32位内存模式一样,可以直接强制转换。
如果不一致。用联合体更简单

memcpy(&val,buf,4);
这样呢

出615入1076汤圆

发表于 2018-8-28 13:17:51 | 显示全部楼层
本帖最后由 dukelec 于 2018-8-28 13:51 编辑
myiccdream 发表于 2018-8-28 11:35
你这个太麻烦了。
如果你的数组和32位内存模式一样,可以直接强制转换。
如果不一致。用联合体更简单


沒錯,正常強制轉換就可以,但是用的芯片是 TI 的 DSP, 它根本就不遵守 C 的規範,char 型或者說 uint8_t 都是 16 位的,編譯器不支持 8 位!把我噁心到了,後來果斷換 STM32F4 了。
(譬如串口接收四個字節 0x01 0x02 0x03 0x04, 那麼實際內存數據爲:0x0001 0x0002 0x0003 0x0004.)
(再上一次被 TI 噁心是用 CC254x 的時候。)

當時我的改法是用頭文件定義來轉,調用時一行代碼搞定,同樣的,原本 5、6 行的一堆 if else 數據超限判斷也被替換爲 min max clip 等宏,別的不說,至少代碼一下子能少一大半:


換 STM32 之後,用 GCC 編譯,min max 等宏可以實現 C++ 的模板功能,不用擔心有副作用(譬如 min(get_val(), 30) 就不會多次調用 get_val() 函數,傳 a++ 這種也沒問題):


可供複製粘貼的源代碼:https://github.com/dukelec/cdnet/blob/master/utils/cd_utils.h

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出615入1076汤圆

发表于 2018-8-28 13:31:56 | 显示全部楼层
jufr12315 发表于 2018-8-28 12:29
memcpy(&val,buf,4);
这样呢


因爲 char 是 16 bit, TI 專有,所以不行。。。解法見樓上。。。

出0入0汤圆

发表于 2018-8-28 15:34:00 | 显示全部楼层
楼主知足吧,我遇到过一个函数写好几米长

出0入4汤圆

发表于 2018-8-28 15:53:23 | 显示全部楼层
我刚上班时,就是干这个事。经常变量或函数名是:mifu...
而且还是汇编。

都是硬啃下来的

出0入0汤圆

发表于 2018-8-28 15:59:59 | 显示全部楼层
honami520 发表于 2018-8-28 01:45
我上家公司,一开始拿到的是日本电装发过来的代码,铃木的一款汽车仪表的代码。
我觉得代码写的就是一坨屎 ...

看了下misra2004:74 S:Union declared. 避免使用联合定义数据结构。
联合定义结构体带来什么隐患?

出20入26汤圆

发表于 2018-8-28 16:06:59 | 显示全部楼层
dukelec 发表于 2018-8-28 13:31
因爲 char 是 16 bit, TI 專有,所以不行。。。解法見樓上。。。

那确实不行,哈哈 16bit的char

出300入477汤圆

发表于 2018-8-28 16:23:54 来自手机 | 显示全部楼层
本帖最后由 redroof 于 2018-8-28 16:28 编辑
dukelec 发表于 2018-8-28 13:17
沒錯,正常強制轉換就可以,但是用的芯片是 TI 的 DSP, 它根本就不遵守 C 的規範,char 型或者說 uint8_t ...


那个dsp的体系结构是多少年前就定死了的,以后都兼容上一代,就一直没法改。谁叫它们当初选择了内存按16位编址呢?
char的最基本定义就是内存的一个最小可寻址单元,所以对这种dsp就是16位
当年在这种结构的DSP上改网络协议栈,改的烦得要死~
别人正常的数据包结构,到他这里全得改一遍~
想写出在(一个short等于两个char)和(一个short等于一个char)这两种体系结构下面都正确的代码,简直太难了

出615入1076汤圆

发表于 2018-8-28 16:36:39 | 显示全部楼层
本帖最后由 dukelec 于 2018-8-28 16:55 编辑
redroof 发表于 2018-8-28 16:23
那个dsp的体系结构是多少年前就定死了的,以后都兼容上一代,就一直没法改。谁叫它们当初选择了内存按16 ...


是的,简直全线不兼容。。。
我觉得编译器软件去支持标准 8 位 char 也是能改善很多的,然而并没有这样做,所以软件(编译器)、硬件(CPU)都烂。。。

再好的协议栈也不过是可以设置平台大小端、32 位 和 64 位 等不同位宽的兼容,还真不可能有去兼容连最基本的 8 位 char 型都不支持的平台。。。

真不知道选这片子的人是不是有自虐倾向。。。

这个帖子要变成「如何针对 糟糕的 CPU 架构选型进行安全重构」了。。。

出0入0汤圆

发表于 2018-8-28 16:43:42 | 显示全部楼层
重新写吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 04:01

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表