Examples of errors detected by the V780 diagnostic
V780. The object of non-passive (non-PDS) type cannot be used with the function.
Tizen
V780 The object 'my_voicedata' of a non-passive (non-PDS) type cannot be initialized using the memset function. ise-stt-mode.cpp 773
typedef struct _VoiceData VoiceData;
struct _VoiceData
{
int voicefw_state;
stt_h voicefw_handle;
Evas_Object *naviframe;
Evas_Object *layout_main;
Evas_Object *progressbar;
Evas_Object *scroller;
Evas_Object *main_entry;
Evas_Object *mic_button;
SttStateVal state;
char *kbd_lang;
Ecore_Timer *start_timer;
Ecore_Timer *refresh_timer;
Ecore_Timer *progressbar_timer;
Ecore_Timer *textblock_timer;
Ecore_Timer *guide_text_timer;
Ecore_Timer *btn_disabling_timer;
Ecore_Timer *power_unlock_timer;
Ecore_Timer *init_timer;
std::vector<std::string> stt_results; // <=
char *partial_result;
int result_type;
int disclaimer;
is::stt::SttFeedback *sttfeedback;
is::stt::SttManager *sttmanager;
is::ui::WInputSttMicEffect *ieffect;
is::ui::MicEffector *effector;
};
void show_voice_input(....)
{
....
my_voicedata = (VoiceData*)malloc(sizeof(VoiceData)); // <=
if (my_voicedata == NULL) {
LOGD("%d::::Heap Overflow, ......!", __LINE__);
return;
}
memset(my_voicedata, 0, sizeof(VoiceData)); // <=
....
}
void on_destroy(VoiceData *r_voicedata)
{
....
VoiceData *voicedata = (VoiceData *)r_voicedata;
....
free(voicedata); // <=
}
An object is created by the malloc and memset functions and destroyed using the free function. The constructor for the object of the std::vector<std::string> is not called. Such an object cannot be used. The destructor is not called. At least there will be a memory leak. In general, there is no point in thinking how this code may work. There will be definitely undefined behavior.
Similar errors can be found in some other places:
- V780 The object 'my_voicedata' of a non-passive (non-PDS) type cannot be initialized using the memset function. w-input-stt-ise.cpp 51
DeepSpeech
V780 The object '& params' of a non-passive (non-PDS) type cannot be initialized using the memset function. binary_format.cc 261
/* Not the best numbering system,
but it grew this way for historical reasons
* and I want to preserve existing binary files. */
typedef enum
{
PROBING=0,
REST_PROBING=1,
TRIE=2,
QUANT_TRIE=3,
ARRAY_TRIE=4,
QUANT_ARRAY_TRIE=5
}
ModelType;
....
struct FixedWidthParameters {
unsigned char order;
float probing_multiplier;
// What type of model is this?
ModelType model_type;
// Does the end of the file
// have the actual strings in the vocabulary?
bool has_vocabulary;
unsigned int search_version;
};
....
// Parameters stored in the header of a binary file.
struct Parameters {
FixedWidthParameters fixed;
std::vector<uint64_t> counts;
};
....
void BinaryFormat::FinishFile(....)
{
....
// header and vocab share the same mmap.
Parameters params = Parameters();
memset(¶ms, 0, sizeof(Parameters)); // <=
....
}