Commit 75e7ac27 authored by Pavel Vainerman's avatar Pavel Vainerman

fixes afer coverity scan (https://scan.coverity.com)

parent 8abc23cb
...@@ -2162,7 +2162,7 @@ namespace uniset ...@@ -2162,7 +2162,7 @@ namespace uniset
{ {
p.nbyte = uniset::uni_atoi(sbyte.c_str()); p.nbyte = uniset::uni_atoi(sbyte.c_str());
if( p.nbyte < 0 || p.nbyte > VTypes::Byte::bsize ) if( p.nbyte > VTypes::Byte::bsize )
{ {
mbwarn << myname << "(initRSProperty): BAD nbyte=" << p.nbyte mbwarn << myname << "(initRSProperty): BAD nbyte=" << p.nbyte
<< ". (0 >= nbyte < " << VTypes::Byte::bsize << ")." << endl; << ". (0 >= nbyte < " << VTypes::Byte::bsize << ")." << endl;
......
...@@ -95,10 +95,10 @@ namespace uniset ...@@ -95,10 +95,10 @@ namespace uniset
public IOBase public IOBase
{ {
// only for RTU // only for RTU
short nbit; /*!< bit number (-1 - not used) */ int16_t nbit; /*!< bit number (-1 - not used) */
VTypes::VType vType; /*!< type of value */ VTypes::VType vType; /*!< type of value */
unsigned short rnum; /*!< count of registers */ uint16_t rnum; /*!< count of registers */
unsigned short nbyte; /*!< byte number (1-2) */ uint16_t nbyte; /*!< byte number (1-2) */
RSProperty(): RSProperty():
nbit(-1), vType(VTypes::vtUnknown), nbit(-1), vType(VTypes::vtUnknown),
......
...@@ -204,21 +204,36 @@ MBTCPMultiMaster::~MBTCPMultiMaster() ...@@ -204,21 +204,36 @@ MBTCPMultiMaster::~MBTCPMultiMaster()
{ {
if( pollThread ) if( pollThread )
{ {
pollThread->stop(); try
{
pollThread->stop();
if( pollThread->isRunning() ) if( pollThread->isRunning() )
pollThread->join(); pollThread->join();
}
catch( Poco::NullPointerException& ex )
{
}
} }
if( checkThread ) if( checkThread )
{ {
checkThread->stop(); try
{
checkThread->stop();
if( checkThread->isRunning() ) if( checkThread->isRunning() )
checkThread->join(); checkThread->join();
}
catch( Poco::NullPointerException& ex )
{
}
} }
mbi = mblist.rend(); mbi = mblist.rend();
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen ) std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
...@@ -504,6 +519,7 @@ void MBTCPMultiMaster::check_thread() ...@@ -504,6 +519,7 @@ void MBTCPMultiMaster::check_thread()
<< " respond_id=" << it->respond_id << " respond_id=" << it->respond_id
<< " respond_force=" << it->respond_force << " respond_force=" << it->respond_force
<< " respond=" << it->respond << " respond=" << it->respond
<< " respond_invert=" << it->respond_invert
<< " activated=" << checkProcActive() << " activated=" << checkProcActive()
<< " ]" << " ]"
<< endl; << endl;
......
...@@ -512,10 +512,17 @@ namespace uniset ...@@ -512,10 +512,17 @@ namespace uniset
if( tcpserver && tcpserver->isActive() ) if( tcpserver && tcpserver->isActive() )
tcpserver->terminate(); tcpserver->terminate();
if( thr && thr->isRunning() ) try
{
if( thr && thr->isRunning() )
{
thr->stop();
// thr->join();
}
}
catch( Poco::NullPointerException& ex )
{ {
thr->stop();
// thr->join();
} }
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -65,6 +65,8 @@ namespace uniset ...@@ -65,6 +65,8 @@ namespace uniset
* *
* \note Каждый экземпляр класса CallbackTimer создает поток, поэтому \b желательно не создавать больше одного экземпляра, * \note Каждый экземпляр класса CallbackTimer создает поток, поэтому \b желательно не создавать больше одного экземпляра,
* для одного процесса (чтобы не порождать много потоков). * для одного процесса (чтобы не порождать много потоков).
*
* \todo Можно уже переписать с использованием c++11 и далее..
*/ */
template <class Caller> template <class Caller>
class CallbackTimer class CallbackTimer
......
...@@ -121,6 +121,7 @@ static UTypes::ShortIOInfo toUTypes( IOController_i::ShortIOInfo i ) ...@@ -121,6 +121,7 @@ static UTypes::ShortIOInfo toUTypes( IOController_i::ShortIOInfo i )
ret.tv_sec = i.tv_sec; ret.tv_sec = i.tv_sec;
ret.tv_nsec = i.tv_nsec; ret.tv_nsec = i.tv_nsec;
ret.supplier = i.supplier; ret.supplier = i.supplier;
ret.supplier_node = UTypes::DefaultID;
return ret; return ret;
} }
......
...@@ -215,14 +215,13 @@ namespace uniset ...@@ -215,14 +215,13 @@ namespace uniset
DebugStream::IosFlagSaver ifs(os); DebugStream::IosFlagSaver ifs(os);
// << setiosflags(ios::showbase) // для вывода в формате 0xNN // << setiosflags(ios::showbase) // для вывода в формате 0xNN
os << hex << showbase << setfill('0'); // << showbase; ostringstream s;
s << hex << showbase << setfill('0'); // << showbase;
for( size_t i = 0; i < len; i++ ) for( size_t i = 0; i < len; i++ )
os << setw(2) << (short)(m[i]) << " "; s << setw(2) << (short)(m[i]) << " ";
// s << "<" << setw(2) << (int)(m[i]) << ">";
return os; return os << s.str();
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusHeader& m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, const ModbusHeader& m )
...@@ -495,7 +494,12 @@ namespace uniset ...@@ -495,7 +494,12 @@ namespace uniset
{ {
os << "["; os << "[";
for( size_t i = d.b.size() - 1; i >= 0; i-- ) int max = d.b.size();
if( max > 0 )
max--;
// вывод в обратном порядке
for( int i = max; i >= 0; i-- )
os << d.b[i]; os << d.b[i];
os << "]"; os << "]";
...@@ -556,7 +560,13 @@ namespace uniset ...@@ -556,7 +560,13 @@ namespace uniset
{ {
os << "["; os << "[";
for( size_t i = d.b.size() - 1; i >= 0; i-- ) int sz = d.b.size();
if( sz > 0 )
sz--;
// выводим в обратном порядке
for( int i = sz; i >= 0; i-- )
os << d.b[i]; os << d.b[i];
os << "]"; os << "]";
...@@ -1351,13 +1361,13 @@ namespace uniset ...@@ -1351,13 +1361,13 @@ namespace uniset
DataBits b(data[bcnt - 1]); DataBits b(data[bcnt - 1]);
b.b[qnum] = state; b.b[qnum] = state;
data[bcnt - 1] = b.mbyte(); data[bcnt - 1] = b.mbyte();
quant++; ++quant;
return (quant - 1); return (quant - 1);
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool ForceCoilsMessage::setBit( uint8_t nbit, bool state ) bool ForceCoilsMessage::setBit( uint8_t nbit, bool state )
{ {
if( nbit < 0 || nbit >= quant ) if( nbit >= quant )
return false; return false;
size_t bnum = nbit / BitsPerByte; size_t bnum = nbit / BitsPerByte;
...@@ -2768,7 +2778,7 @@ namespace uniset ...@@ -2768,7 +2778,7 @@ namespace uniset
{ {
assert( m.pduhead.func == fnJournalCommand ); assert( m.pduhead.func == fnJournalCommand );
//memset(this, 0, sizeof(*this)); //memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(m.pduhead)); // m.len
// переворачиваем слова // переворачиваем слова
cmd = SWAPSHORT(cmd); cmd = SWAPSHORT(cmd);
...@@ -2779,7 +2789,7 @@ namespace uniset ...@@ -2779,7 +2789,7 @@ namespace uniset
{ {
assert( m.pduhead.func == fnJournalCommand ); assert( m.pduhead.func == fnJournalCommand );
// memset(this, 0, sizeof(*this)); // memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(m.pduhead)); // m.len
// переворачиваем слова // переворачиваем слова
cmd = SWAPSHORT(cmd); cmd = SWAPSHORT(cmd);
...@@ -3034,14 +3044,14 @@ namespace uniset ...@@ -3034,14 +3044,14 @@ namespace uniset
{ {
assert( m.pduhead.func == fnSetDateTime ); assert( m.pduhead.func == fnSetDateTime );
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(m.pduhead)); // m.len
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
SetDateTimeMessage& SetDateTimeMessage::operator=( const ModbusMessage& m ) SetDateTimeMessage& SetDateTimeMessage::operator=( const ModbusMessage& m )
{ {
assert( m.pduhead.func == fnSetDateTime ); assert( m.pduhead.func == fnSetDateTime );
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(m.pduhead)); // m.len
return *this; return *this;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
...@@ -3055,7 +3065,8 @@ namespace uniset ...@@ -3055,7 +3065,8 @@ namespace uniset
{ {
DebugStream::IosFlagSaver ifs(os); DebugStream::IosFlagSaver ifs(os);
os << setfill('0') ostringstream s;
s << setfill('0')
<< setw(2) << (int)m.day << "-" << setw(2) << (int)m.day << "-"
<< setw(2) << (int)m.mon << "-" << setw(2) << (int)m.mon << "-"
<< setw(2) << (int)m.century << setw(2) << (int)m.century
...@@ -3064,7 +3075,7 @@ namespace uniset ...@@ -3064,7 +3075,7 @@ namespace uniset
<< setw(2) << (int)m.min << ":" << setw(2) << (int)m.min << ":"
<< setw(2) << (int)m.sec; << setw(2) << (int)m.sec;
return os; return os << s.str();
} }
std::ostream& ModbusRTU::operator<<(std::ostream& os, SetDateTimeMessage* m ) std::ostream& ModbusRTU::operator<<(std::ostream& os, SetDateTimeMessage* m )
...@@ -3102,7 +3113,7 @@ namespace uniset ...@@ -3102,7 +3113,7 @@ namespace uniset
ModbusMessage SetDateTimeMessage::transport_msg() ModbusMessage SetDateTimeMessage::transport_msg()
{ {
ModbusMessage mm; ModbusMessage mm;
assert( sizeof(ModbusMessage) >= (unsigned int)szModbusHeader + szData() ); assert( sizeof(ModbusMessage) >= szModbusHeader + szData() );
// копируем заголовок и данные // копируем заголовок и данные
memcpy(&mm.pduhead, this, szModbusHeader); memcpy(&mm.pduhead, this, szModbusHeader);
...@@ -3142,7 +3153,7 @@ namespace uniset ...@@ -3142,7 +3153,7 @@ namespace uniset
{ {
assert( m.pduhead.func == fnSetDateTime ); assert( m.pduhead.func == fnSetDateTime );
memset(this, 0, sizeof(*this)); memset(this, 0, sizeof(*this));
memcpy(this, &m.pduhead, sizeof(*this)); // m.len memcpy(this, &m.pduhead, sizeof(m.pduhead)); // m.len
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
SetDateTimeRetMessage::SetDateTimeRetMessage( ModbusAddr _from ) SetDateTimeRetMessage::SetDateTimeRetMessage( ModbusAddr _from )
...@@ -3175,7 +3186,7 @@ namespace uniset ...@@ -3175,7 +3186,7 @@ namespace uniset
ModbusMessage SetDateTimeRetMessage::transport_msg() ModbusMessage SetDateTimeRetMessage::transport_msg()
{ {
ModbusMessage mm; ModbusMessage mm;
assert( sizeof(ModbusMessage) >= (unsigned int)szModbusHeader + szData() ); assert( sizeof(ModbusMessage) >= szModbusHeader + szData() );
// копируем заголовок и данные // копируем заголовок и данные
memcpy(&mm.pduhead, this, szModbusHeader); memcpy(&mm.pduhead, this, szModbusHeader);
...@@ -3290,7 +3301,7 @@ namespace uniset ...@@ -3290,7 +3301,7 @@ namespace uniset
ModbusMessage RemoteServiceRetMessage::transport_msg() ModbusMessage RemoteServiceRetMessage::transport_msg()
{ {
ModbusMessage mm; ModbusMessage mm;
assert( sizeof(ModbusMessage) >= (unsigned int)szModbusHeader + szData() ); assert( sizeof(ModbusMessage) >= szModbusHeader + szData() );
// копируем заголовок и данные // копируем заголовок и данные
memcpy(&mm.pduhead, this, szModbusHeader); memcpy(&mm.pduhead, this, szModbusHeader);
...@@ -3545,7 +3556,7 @@ namespace uniset ...@@ -3545,7 +3556,7 @@ namespace uniset
ModbusMessage FileTransferRetMessage::transport_msg() ModbusMessage FileTransferRetMessage::transport_msg()
{ {
ModbusMessage mm; ModbusMessage mm;
assert( sizeof(ModbusMessage) >= (unsigned int)(szModbusHeader + szData()) ); assert( sizeof(ModbusMessage) >= (szModbusHeader + szData()) );
// копируем заголовок и данные // копируем заголовок и данные
memcpy(&mm.pduhead, this, szModbusHeader); memcpy(&mm.pduhead, this, szModbusHeader);
......
...@@ -1332,10 +1332,10 @@ namespace uniset ...@@ -1332,10 +1332,10 @@ namespace uniset
void UInterface::CacheOfResolve::erase( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept void UInterface::CacheOfResolve::erase( const uniset::ObjectId id, const uniset::ObjectId node ) const noexcept
{ {
uniset::uniset_rwmutex_wrlock l(cmutex);
try try
{ {
uniset::uniset_rwmutex_wrlock l(cmutex);
auto it = mcache.find( uniset::key(id, node) ); auto it = mcache.find( uniset::key(id, node) );
if( it != mcache.end() ) if( it != mcache.end() )
......
...@@ -116,7 +116,8 @@ namespace uniset ...@@ -116,7 +116,8 @@ namespace uniset
} }
SensorMessage::SensorMessage( int dummy ) noexcept: SensorMessage::SensorMessage( int dummy ) noexcept:
Message(1) // вызываем dummy-конструктор, который не инициализирует данные (оптимизация) Message(1), // вызываем dummy-конструктор, который не инициализирует данные (оптимизация)
ci(IOController_i::CalibrateInfo())
{ {
type = Message::SensorInfo; type = Message::SensorInfo;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment