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)); // <=
....
}
Godot Engine
V780 Instantiation of LocalVector < AnimationCompressionDataState >: The object 'w' of a non-passive (non-PDS) type cannot be copied using the memcpy function. local_vector.h 280
template <class T, class U = uint32_t,
bool force_trivial = false, bool tight = false>
class LocalVector
{
....
public:
operator Vector<T>() const
{
Vector<T> ret;
ret.resize(size());
T *w = ret.ptrw();
memcpy(w, data, sizeof(T) * count); // <=
return ret;
}
....
_FORCE_INLINE_ LocalVector(const LocalVector &p_from) { .... }
....
};
struct AnimationCompressionDataState
{
uint32_t components = 3;
LocalVector<uint8_t> data; // Committed packets.
struct PacketData
{
int32_t data[3] = { 0, 0, 0 };
uint32_t frame = 0;
};
float split_tolerance = 1.5;
LocalVector<PacketData> temp_packets;
// used for rollback if the new frame does not fit
int32_t validated_packet_count = -1;
....
};
The class AnimationCompressionDataState contains an instance of LocalVector<uint8_t>, which has a non-trivial copy constructor. Therefore, AnimationCompressionDataState itself is non-trivially copyable. If the objects passed to memcpy are potentially-overlapping or not TriviallyCopyable, the behavior of 'memcpy' is not specified and may be undefined.
Similar errors can be found in some other places:
- V780 Instantiation of LocalVector < LocalVector <int> >: The object 'w' of a non-passive (non-PDS) type cannot be copied using the memcpy function. local_vector.h 280
- V780 Instantiation of LocalVector < Mapping, uint32_t, bool, bool >: The object 'w' of a non-passive (non-PDS) type cannot be copied using the memcpy function. local_vector.h 280
- V780 Instantiation of LocalVector < OAHashMap < uint64_t, Specialization > >: The object 'w' of a non-passive (non-PDS) type cannot be copied using the memcpy function. local_vector.h 280
- And 1 additional diagnostic messages.
Xenia
V780 The object 'out_info' of a non-passive (non-PDS) type cannot be initialized using the memset function. filesystem_win.cc 209
struct FileInfo
{
enum class Type
{
kFile,
kDirectory,
};
Type type;
std::filesystem::path name;
std::filesystem::path path;
size_t total_size;
uint64_t create_timestamp;
uint64_t access_timestamp;
uint64_t write_timestamp;
};
bool GetInfo(const std::filesystem::path& path, FileInfo* out_info)
{
std::memset(out_info, 0, sizeof(FileInfo)); // <=
....
if (....) return false;
/* fill 'out_info' data members */
return true;
}
An object of the 'FileInfo' type is passed to the memset function as an argument. This type contains data members of the 'std::filesystem::path' type, which isn't trivially copyable. Using such data in the memset function may lead to undefined behavior.