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

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

我方的函数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库函数等都是下策)
...全文
7022 116 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
116 条回复
切换为时间正序
请发表友善的回复…
发表回复
蜥蜴枪王 2011-10-13
  • 打赏
  • 举报
回复
额 虽然不明白,但好象很厉害的样子 ...
yuxiangju 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 120 楼 jiahehao 的回复:]
引用 97 楼 doublejoker163 的回复:
lz公司和客户沟通过,但lz没说客户没有修改此接口的理由,只是认为客户刁难,证明沟通不到位
可能客户这样写是有他的理由的,所以建议lz先用办法1,如果不可行的话就用下面的办法2吧。

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

2.若接口存在缺陷,正式发文给客户,说明清楚接口有什么问题,给出修改建议(最后是建议新增……
[/Quote]


yyg_pl 2011-08-09
  • 打赏
  • 举报
回复
不给他做不就完了吗? 他爱找谁做找谁做呗,再怎么说也不能当狗呀. 没有建立在平等的的基础之上, 何来合做?
jiahehao 2011-08-08
  • 打赏
  • 举报
回复
[Quote=引用 97 楼 doublejoker163 的回复:]
lz公司和客户沟通过,但lz没说客户没有修改此接口的理由,只是认为客户刁难,证明沟通不到位
可能客户这样写是有他的理由的,所以建议lz先用办法1,如果不可行的话就用下面的办法2吧。

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

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

这个靠谱。
假动作 2011-08-08
  • 打赏
  • 举报
回复

楼主速度猥琐现身
用户 昵称 2011-08-07
  • 打赏
  • 举报
回复
用一句老话来说,就是雕虫
maquan 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 102 楼 0153 的回复:]
原来是过去经历的一件事权当趣味题,现在看来有些偏离了,虽然有几楼答得不错,现公布解决方案稍后结贴。
当时我方开会讨论时就提出了对方函数在接收设备数据正常和有错误两种分支时,在时间和空间上有差异。
由于时间的不稳定性,故采取检测空间差异的方式:
原理:funB中错误分支消耗堆栈远多余正常分支
……
[/Quote]
我其实更关注楼主的那个项目最后是怎么收场的。

这个接口问题最后对方纠正了吗?你们最终交付的代码是带着这样的补丁吗?双方关系改善了吗?后来对方又有什么“刁难”的举动了吗?项目成功了吗?双方后来还有合作吗?


--------
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.

————————————————————————————————
基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)
romanitc 2011-08-06
  • 打赏
  • 举报
回复
貌似C语言方面滴!路过!
w20011025 2011-08-06
  • 打赏
  • 举报
回复
[Quote=引用 100 楼 dfasri 的回复:]
引用楼主 0153 的回复:
都说做外包如同做狗,而狗是没有说话权的,只能看主人的脸色行事,讨一杯残羹……
以下是以前做外包时遇到的一个真实的案例,大家可以思考一下,稍后给出我方当时的方案(非常伪锁)

我方的函数U中有以下流程
...
u8* p;//u8=unsigned char
s16 i,n;//s16=signed short
...
p=fnA(&n……
[/Quote]采用这种方式能够有效降低几率的了.
lele1028265767 2011-08-06
  • 打赏
  • 举报
回复
看不懂····
xiaojinhua1988 2011-08-06
  • 打赏
  • 举报
回复
看不下去了
kkrmr 2011-08-05
  • 打赏
  • 举报
回复
看答案
AndyZhang 2011-08-05
  • 打赏
  • 举报
回复
当面对质,不是你的错
dfasri 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用 102 楼 0153 的回复:]

原来是过去经历的一件事权当趣味题,现在看来有些偏离了,虽然有几楼答得不错,现公布解决方案稍后结贴。

当时我方开会讨论时就提出了对方函数在接收设备数据正常和有错误两种分支时,在时间和空间上有差异。

由于时间的不稳定性,故采取检测空间差异的方式:
原理:funB中错误分支消耗堆栈远多余正常分支

funA中:C/C++ code

u8 buf[ 300 ];//分配
memse……
[/Quote]
不明真相...
0153 2011-08-05
  • 打赏
  • 举报
回复
原来是过去经历的一件事权当趣味题,现在看来有些偏离了,虽然有几楼答得不错,现公布解决方案稍后结贴。

当时我方开会讨论时就提出了对方函数在接收设备数据正常和有错误两种分支时,在时间和空间上有差异。

由于时间的不稳定性,故采取检测空间差异的方式:
原理:funB中错误分支消耗堆栈远多余正常分支

funA中:

u8 buf[ 300 ];//分配
memset( buf, 0, 300 );//初始化
...//使用buf的处理
...//使用buf的处理
...//使用buf的处理


funC中

int j;
u8 buf[ 256 ];//分配
...//判断数据
...//判断数据
...//判断数据
memcpy( buf, p, 0256 );//从数据指针中复制256字节
...//分析数据
...//分析数据
...//分析数据
for( j = 228; j < 236; j++ ) {
if( 0 != buf[j] ) {
//分析结果认为数据不合法
...//不把结果写入文件传给D进程
return 0;
}
}
//数据合法
...//正常处理
l4kangaxx 2011-08-05
  • 打赏
  • 举报
回复
我也觉的应该是事先在P的内存里面写了特别的数据,如果返回的数据和初始的时候完全一模一样,这样有没有成功写入就知道了

但万一,非常不幸的写如的正确数据和事先写入的一模一样呢?那就是悲剧了,不过这也没啥,是发包方自作孽啊
dfasri 2011-08-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 0153 的回复:]
都说做外包如同做狗,而狗是没有说话权的,只能看主人的脸色行事,讨一杯残羹……
以下是以前做外包时遇到的一个真实的案例,大家可以思考一下,稍后给出我方当时的方案(非常伪锁)

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

i=fnB(p,n);

……
[/Quote]

采用如下的方式, 假如错误话, P应该是没有赋值的, 那么先把P进行赋值成每个中文字:
"客户就是狗屁客户就是狗屁...." 有多长就赋值多少.
二进制流, 从i=fnB(p,n);回复的I值开始进行检测, 查看是否刚好就为中文字符的编码, 假如不是, 则可认为是正确的, 假如是, 则向前检测, 假如也是上述字符的编码, 则认为fnB是返回错误了. i 就错误码.
设置通信的, 假如是字符串, 通常会是UTF8, 而且是英文, 跟中文肯定不一至, 假如是文件流, 能够刚好组建连续两个中文字几率是很低的.
即函数可写成:
const char* pStr = "\0客户就是狗屁客户就是狗屁....."; // 定义得比n要大即可
u8* p;//u8=unsigned char
s16 i,n;//s16=signed short
...
p=fnA(&n);
memcpy(p, pStr, n);
i=fnB(p,n);
if (i > n) throw "错误啦";
if (i == 0) throw "错误啦";
if (i == 1)
{
if (p[i-1] == pStr[i-1]) throw "错误啦";
}
else if (p[i - 1] == pStr[i - 1] && p[i - 2] == p[i - 2])
throw "错误啦";
fnC(p,i);

采用这种方式能够有效降低几率的了.
java201111 2011-08-05
  • 打赏
  • 举报
回复
天回帖即可获得10分可用分!小技
DoubleJoker163 2011-08-05
  • 打赏
  • 举报
回复
大家就不要等什么答案了,我觉得其实lz自己都没有什么答案
DoubleJoker163 2011-08-05
  • 打赏
  • 举报
回复
lz公司和客户沟通过,但lz没说客户没有修改此接口的理由,只是认为客户刁难,证明沟通不到位
可能客户这样写是有他的理由的,所以建议lz先用办法1,如果不可行的话就用下面的办法2吧。

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

2.若接口存在缺陷,正式发文给客户,说明清楚接口有什么问题,给出修改建议(最后是建议新增接口,而不是修改),同时说明清楚若不作修改有何后果,一切后果不予承担
加载更多回复(96)

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧