2010-08-28 143 views
9
void PacketRecord::determineAppProtocol() 
{ 
    if (ipProtocol == IP_PROTO_UDP) 
    { 
     std::istringstream ss(udpData); 

     std::string line; 
     if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
     { 
      appProtocol = APP_PROTO_SIP; 
     } 
     else 
     { 
      appProtocol == APP_PROTO_RTP; 
     } 
    } 
    else 
    { 
     appProtocol = APP_PROTO_UNKNOWN; 
    } 
} 

如果内部if语句未能评估为真,我期望else块被执行(appProtocol设置为APP_PROTO_RTP)。但是,这不会发生。相反,看起来else语句完全被忽略。我无法理解为什么会出现这种情况。其他语句似乎被忽略

正如您从我的gdb会话中看到的那样,if语句首次运行,并且appProtocol被设置为APP_PROTO_SIP(如预期的那样)。第二次通过时,如果失败,而不进入else并将appProtocol设置为APP_PROTO_RTP,则它将完全退出该功能而不设置appProtocol。 appProtocol保持设置为APP_PROTO_INVALID(它在PacketRecord ctor中初始化的值)。

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x805c6c8) at PacketRecord.cpp:156 
156  if (ipProtocol == IP_PROTO_UDP) 
(gdb) step 
158   std::istringstream ss(udpData); 
(gdb) 
159   std::string line; 
(gdb) 
160   if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
(gdb) 
162    appProtocol = APP_PROTO_SIP; 
(gdb) 
167   } 
(gdb) 
173 } 
(gdb) continue 
Continuing. 

Breakpoint 1, PacketRecord::determineAppProtocol (this=0x8065388) at PacketRecord.cpp:156 
156  if (ipProtocol == IP_PROTO_UDP) 
(gdb) step 
158   std::istringstream ss(udpData); 
(gdb) 
159   std::string line; 
(gdb) 
160   if (getline(ss, line) && (line.find("SIP/2.0") != std::string::npos)) 
(gdb) 
167   } 
(gdb) 
173 } 
(gdb) 
+4

开启编译器警告应发出“声明没有效果”为你的语法错误警告。如果没有,请获得更好的编译器。从你的ubuntu头像判断,'g ++ -Wall'是你应该总是**使用的。 – msw 2010-08-28 15:41:47

+1

@msw:的确如此。很明显,原始代码被封装到问题中(因为它应该),因为手动复制会隐藏这个错误(因为zobdos会不自觉地键入'=',而不是'==')。一个(正面)教科书的例子,说明为什么你总是应该填入代码。 – sbi 2010-08-28 16:06:05

回答

19

你应该

appProtocol = APP_PROTO_RTP; 

(无双等号)

else语句替换

appProtocol == APP_PROTO_RTP; 

执行。但是您并未将值分配给appProtocol。

+1

+1此声明肯定会在代码中完全优化,并与整个分支一起完成。 – 2010-08-28 15:34:01

+0

对。而且应该使用打印代替调试器来解决这些问题。一个简单的'cout << appProtocol << endl'会显示出问题。 – AndiDog 2010-08-28 15:34:32

+8

一个好的编译器也可以对这样的错误发出警告(“语句无效”)。它有助于打开(和高)警告。 – UncleBens 2010-08-28 15:38:39

5

你不分配,你正在比较。使用=,不==

3

你在这里使用的平等声明:

appProtocol == APP_PROTO_RTP; 

,而不是分配。

正确的代码是:

appProtocol = APP_PROTO_RTP;