读书人

【伪锁】当遭遇客户刁难时最快速的应

发布时间: 2012-02-10 21:27:42 作者: rapoo

【伪锁】当遭遇客户刁难时,最快速的应对方案
都说做外包如同做狗,而狗是没有说话权的,只能看主人的脸色行事,讨一杯残羹……
以下是以前做外包时遇到的一个真实的案例,大家可以思考一下,稍后给出我方当时的方案(非常伪锁)

我方的函数U中有以下流程
...
u8* p;//u8=unsigned char
s16 i,n;//s16=signed short
...
p=fnA(&n);

i=fnB(p,n);

fnC(p,i);
...
其中:
fnA是我方写的,负责分配内存
fnB是客户提供的,负责和一设备通讯。其参数p是内存用于存放二进制数据,n是内存最大长度,i是有效数据长度。
fnC是我方写的,负责发送p的i个字节给另一个进程D处理。进程D无任何纠错能力。
客户为了刁难我方,检测到设备的返回值是负数时,故意调用abs后才返回给我方,使得我方在fnC中无法根据i判断p的内容是否有效。我方多次据理力争要求错误时也返回0但被拒绝。

请问我方有哪些方法简单快速地解决这个危机?
(这里分析数据块、直接和下层设备通讯取错误码、覆写abs库函数等都是下策)

[解决办法]
个人认为这个问题已经超出了技术的范围了,应该属于管理的范畴。否则,就算楼主用“非常伪锁”办法解决了这个问题,如果他们再“故意”一次...,你们将会被折腾得很惨。

坦白地说,就算是“非常伪锁”办法,我也想不出来,等着聆听楼主高见。:)
[解决办法]
u8* p;//u8=unsigned char
s16 i,n;//s16=signed short
...
p=fnA(&n);

(u32)*p=0xdeadbeef;
n-=4;
memset(p+4,0xea,n);

i=fnB(p,n);

如果一定要一个办法的话,监测 p;如果出错也修改 p 的内容,那就没辙

fnC(p,i);

[解决办法]

探讨
引用:

个人认为这个问题已经超出了技术的范围了,应该属于管理的范畴。否则,就算楼主用“非常伪锁”办法解决了这个问题,如果他们再“故意”一次...,你们将会被折腾得很惨。

坦白地说,就算是“非常伪锁”办法,我也想不出来,等着聆听楼主高见。:)


首先,设备报错几率很小,断开连接的场合函数返回0这是可处理的。
其次,客户的目的是消耗我们的时……

[解决办法]
可以初始化p由随机值填充,如果不可重复的算法需要复制一份数据。
接受数据以后,再对比一下数据是否被修改。
有个问题就是i越小,越容易冲突。
[解决办法]
你们应该精确的定义好fnB的返回值啊;比如,设备错误1的返回值 -1000 错误2的返回值-999 尤其记得酌情考虑是否需要 返回内存不够的错误值,正确&有数据,返回值才能大于0

---------
你文档,接口工作都做好了,白纸黑字,这样才不会扯皮 ~~~
[解决办法]
s16 i,n;//s16=signed short 也许是将其改定义成无符号型吧
如果用i获取设备通讯返回值,如果能返回负数,那么默认自动转换,原本的符号位为1,变为一个超大数
那么每次使用的时候查看原来的符号位是否为1,若为1则出错过,而按照原来的数据类型,只要一切正常原本符号位不会为1。
我只是这么想的,还没求证过。

我以前吃饱了没事干将各种基本数据类型强制转换来强制转换去,以int为例,小于0的Int强制转换为unsigned的时候,其实就是在2进制位面上直接拷贝,得到的是原始数的补码(原始数为负)直接翻译为unsigned的结果。
[解决办法]
p=fnD(&n);
i=fnB(p,n);
n=i-1;//这三行封装起来不给各户看
p=fnA(&n);

[解决办法]
i=fnB(p,n);
u8 x = p[0];
p[0] = x+1;
i = fnB(p,n);
if(p[0]!=x+1)
fnB Succeed.
else
fnB Failed.
这样行不?
还有什么是伪锁?


[解决办法]
这个嘛,当个趣味题来想,的确挺有意思的,可是就这个实际项目来说,如果楼主所述是真实的,那绝不是纯技术方案能应对的。一定要从商务层面上想办法,拉关系也好,威逼也好,利诱也好,色诱…… 反正他要成心难为你的话,早晚是死路一条。

就当个趣味题来想吧,楼主似乎一直在暗示大家要“伪锁”,就是说,要给那个 p 加个“伪锁” @_@

那就把那块内存设为只读的好了,只要在 fnB() 里面试图写数据,就会引发 EXCEPTION_ACCESS_VIOLATION,通过 SetUnhandledExceptionFilter() 检测到这个事件,然后把内存设为可写,再通过 EXCEPTION_CONTINUE_EXECUTION 让它继续执行。

只要没检测到写内存的动作,不管它返回什么,都当是错误码。

这样可以了吧?hehe,不过千万别让敌人知道这个秘诀,否则他虚写一次,还是死路一条。


--------
With sufficient thrust, pigs fly just fine. However, this is not necessarily a good idea. It is
hard to be sure where they are going to land, and it could be dangerous sitting under them as they
fly overhead.
出自 RFC1925 - The Twelve Networking Truths
[解决办法]
可以初始化p由随机值填充,如果不可重复的算法需要复制一份数据。
接受数据以后,再对比一下数据是否被修改。
有个问题就是i越小,越容易冲突。
[解决办法]
客户为了刁难我方

你还是别在外包了,故意刁难下游公司的上游公司是不存在的。
大家都想赚钱都想把工作做好。为了刁难你就留下一个bug在里面这件事情实在太无聊。


外包是为了赚钱,不是为了刁难下游公司。如果这点儿都理解不了。
趁早换个工作了事。
[解决办法]
大家都沉默是不能解决问题的,我想应该几个人坐下来谈谈,LZ要表现的霸气点,跟他们说:我不喜欢说话,但是我并不是没有脾气。
[解决办法]
开会讨论嘛,MB的,遇到这种装B的,你就得给他上纲上线,在他们老板面前,只要你有理,把你的思路讲出来,以及如果不这样做的后果是什么,你看看他还敢不敢装B。

[解决办法]
对内存块开头初始化一下就可以了,用一个固定的32位数填充,fnB返回后,先检测内存开头有没有被改写。
[解决办法]
自己实现,实现一个abs, 让系统自带的失效,是不?楼主?
[解决办法]
lz公司和客户沟通过,但lz没说客户没有修改此接口的理由,只是认为客户刁难,证明沟通不到位
可能客户这样写是有他的理由的,所以建议lz先用办法1,如果不可行的话就用下面的办法2吧。

1.使用此接口时,自己先判断有没有超出范围,然后再作处理

2.若接口存在缺陷,正式发文给客户,说明清楚接口有什么问题,给出修改建议(最后是建议新增接口,而不是修改),同时说明清楚若不作修改有何后果,一切后果不予承担
[解决办法]

探讨
都说做外包如同做狗,而狗是没有说话权的,只能看主人的脸色行事,讨一杯残羹……
以下是以前做外包时遇到的一个真实的案例,大家可以思考一下,稍后给出我方当时的方案(非常伪锁)

我方的函数U中有以下流程
...
u8* p;//u8=unsigned char
s16 i,n;//s16=signed short
...
p=fnA(&n);

i=fnB(p,n);

……

读书人网 >C++

热点推荐