*** Collection <__NSArrayM: 0x7f9fb3c48bc0> was mutated while being enumerated问题

本文介绍了一种在项目中遇到的遍历数组时程序崩溃的问题,并给出了最终的解决方案。问题出现的原因是在遍历过程中对数组进行了修改。
项目中遍历数组时老崩溃,最后成功解决,报这种错误其实就是遍历该数组的过程中修改了该数组.修改之后的代码为
// // Created by k50048780 on 25-6-25. // #include "StringFormatRandom.h" #include "../../data_types/string_.h" #include <random> #include <algorithm> const std::vector<std::string> StringFormatRandom::formatStrings = { "%s%-lc%d%#f%a%+i%@%s%-lc%d%#f%a%+i%@%s%-lc%d%#f%a%", "%s%s%s%s", "%n%x%d", "%s%d%u%x!@#$%&*()\t\r\n-=%s%d%u%x!@#$%&*()\t\r\n-=%s%d%u%x!@#$%", "%0.0d", "%*$c", "%#0123456x%08x%x%s%p%d%n%o%u%c%h%l%q%j%z%Z%t%i%e%g%f%a%C%S%08x%%", "%d%d%d%d", "%r%s%-d%f%i", "%u%d%-i%x%b", "%c%o%-E%e%g%s", "%G%s%-d%r%u%f", }; StringFormatRandom::StringFormatRandom(std::shared_ptr<StringBase> obj, std::mt19937& rand) : StringMutator(obj, rand), randEngine(rand) {} std::int64_t StringFormatRandom::get_count() { return formatStrings.size(); } bool StringFormatRandom::supported(std::shared_ptr<StringBase> obj) { return (std::dynamic_pointer_cast<StringBase>(obj) != nullptr); } void StringFormatRandom::perform_mutation(std::shared_ptr<StringBase> obj, std::int64_t index) { if (index < formatStrings.size()) { // 将选中的格式字符串作为新的变异值 obj->mutated_value = std::vector<uint8_t>(formatStrings[index].begin(), formatStrings[index].end()); } } int StringFormatRandom::get_cur_mutation_idx() { int index = cur_mutation_idx++; if (cur_mutation_idx >= static_cast<int>(formatStrings.size())) { cur_mutation_idx = 0; } return index; } void StringFormatRandom::sequential_mutation(std::shared_ptr<StringBase> obj) { auto stringObj = std::dynamic_pointer_cast<StringBase>(obj); if (stringObj) { perform_mutation(stringObj, get_cur_mutation_idx()); stringObj->mutated = true; } } void StringFormatRandom::random_mutation(std::shared_ptr<StringBase> obj) { auto stringObj = std::dynamic_pointer_cast<StringBase>(obj); if (stringObj) { // 生成随机索引 [0, size-1] std::uniform_int_distribution<size_t> dist(0, formatStrings.size() - 1); size_t randomIndex = dist(randEngine); perform_mutation(stringObj, randomIndex); stringObj->mutated = true; } } 报错/data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.cpp: In member function ‘virtual void StringFormatRandom::perform_mutation(std::shared_ptr<StringBase>, int64_t)’: /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.cpp:40:107: error: no match for ‘operator=’ (operand types are ‘std::__cxx11::basic_string<char>’ and ‘std::vector<unsigned char>’) 40 | 8_t>(formatStrings[index].begin(), formatStrings[index].end()); | ^ In file included from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/string:55, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/random:40, from /data/k50048780/cpp_mutator2/mutators/string/../../utils/sample_util.h:9, from /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.h:8, from /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.cpp:5: /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:674:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 674 | operator=(const basic_string& __str) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:674:37: note: no known conversion for argument 1 from ‘std::vector<unsigned char>’ to ‘const std::__cxx11::basic_string<char>&’ 674 | operator=(const basic_string& __str) | ~~~~~~~~~~~~~~~~~~~~^~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:713:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _CharT*) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 713 | operator=(const _CharT* __s) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:713:31: note: no known conversion for argument 1 from ‘std::vector<unsigned char>’ to ‘const char*’ 713 | operator=(const _CharT* __s) | ~~~~~~~~~~~~~~^~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:724:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(_CharT) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 724 | operator=(_CharT __c) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:724:24: note: no known conversion for argument 1 from ‘std::vector<unsigned char>’ to ‘char’ 724 | operator=(_CharT __c) | ~~~~~~~^~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:741:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&&) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 741 | operator=(basic_string&& __str) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:741:32: note: no known conversion for argument 1 from ‘std::vector<unsigned char>’ to ‘std::__cxx11::basic_string<char>&&’ 741 | operator=(basic_string&& __str) | ~~~~~~~~~~~~~~~^~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:804:7: note: candidate: ‘std::__cxx11::basic_string<_CharT, _Traits, _Alloc>& std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(std::initializer_list<_Tp>) [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 804 | operator=(initializer_list<_CharT> __l) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:804:42: note: no known conversion for argument 1 from ‘std::vector<unsigned char>’ to ‘std::initializer_list<char>’ 804 | operator=(initializer_list<_CharT> __l) | ~~~~~~~~~~~~~~~~~~~~~~~~~^~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:818:8: note: candidate: ‘template<class _Tp> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::_If_sv<_Tp, std::__cxx11::basic_string<_CharT, _Traits, _Alloc>&> std::__cxx11::basic_string<_CharT, _Traits, _Alloc>::operator=(const _Tp&) [with _Tp = _Tp; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ 818 | operator=(const _Tp& __svt) | ^~~~~~~~ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:818:8: note: template argument deduction/substitution failed: In file included from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/move.h:55, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_pair.h:59, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/stl_algobase.h:64, from /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/vector:60, from /data/k50048780/cpp_mutator2/mutators/string/../../utils/sample_util.h:8, from /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.h:8, from /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.cpp:5: /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/type_traits: In substitution of ‘template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = std::integral_constant<bool, false>::value; _Tp = std::__cxx11::basic_string<char>&]’: /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:121:8: required by substitution of ‘template<class _CharT, class _Traits, class _Alloc> template<class _Tp, class _Res> using _If_sv = std::enable_if_t<std::__and_<std::is_convertible<const _Tp&, std::basic_string_view<_CharT, _Traits> >, std::__not_<std::is_convertible<const _Tp*, const std::__cxx11::basic_string<_CharT, _Traits, _Alloc>*> >, std::__not_<std::is_convertible<const _Tp&, const _CharT*> > >::value, _Res> [with _Tp = std::vector<unsigned char>; _Res = std::__cxx11::basic_string<char>&; _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]’ /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/bits/basic_string.h:818:8: required by substitution of ‘template<class _Tp> std::__cxx11::basic_string<char>::_If_sv<_Tp, std::__cxx11::basic_string<char>&> std::__cxx11::basic_string<char>::operator=<_Tp>(const _Tp&) [with _Tp = std::vector<unsigned char>]’ /data/k50048780/cpp_mutator2/mutators/string/StringFormatRandom.cpp:40:107: required from here /data/taoli/c_compiler/gcc-9.5.0/include/c++/9.5.0/type_traits:2378:11: error: no type named ‘type’ in ‘struct std::enable_if<false, std::__cxx11::basic_string<char>&>’ 2378 | using enable_if_t = typename enable_if<_Cond, _Tp>::type; | ^~~~~~~~~~~
07-01
#include "../utils.h" #include "StringLengthVariance.h" #include <algorithm> #include <vector> std::vector<std::shared_ptr<StringBase>> StringLengthVariance::mutated_elements; StringLengthVariance::StringLengthVariance(std::shared_ptr<StringBase> obj, std::mt19937 &rand) : IntegerVariance(std::static_pointer_cast<StringBase>(obj), rand, false) {} std::pair<int64_t, int64_t> StringLengthVariance::get_limits(std::shared_ptr<StringBase> obj) { /* TODO:获取长度边界代码待完善 */ int64_t max_output_size_bits = static_cast<int64_t>(obj->mutator_config.max_output_size * 8); int64_t size_bits = llrint(obj->calculate_bit_size()); int64_t limit_bits = std::max(max_output_size_bits, size_bits); int64_t limit_bytes = (limit_bits + 7) / 8; int64_t max_length = limit_bytes; if (obj->max_length != nullptr) { max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); } int64_t min_length = 0; if (obj->min_length.has_value()) { min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); } return {min_length, max_length}; } int64_t StringLengthVariance::get_value(std::shared_ptr<StringBase> obj) { return std::min(static_cast<int64_t>(obj->value.size()), max_); } void StringLengthVariance::perform_mutation(std::shared_ptr<StringBase> obj, int64_t value) { obj->mutated_value = expand(obj->value, static_cast<size_t>(value)); obj->mutated = true; mutated_elements.push_back(obj); } bool StringLengthVariance::supported(std::shared_ptr<StringBase> obj) { return std::dynamic_pointer_cast<StringBase>(obj) != nullptr; } std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { return mutated_elements; }报错/data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: In member function ‘virtual std::pair<long int, long int> StringLengthVariance::get_limits(std::shared_ptr<StringBase>)’: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:24:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 24 | if (obj->max_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:25:81: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::max_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 25 | max_length = std::min(limit_bytes, static_cast<int64_t>(obj->max_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:28:25: error: request for member ‘has_value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 28 | if (obj->min_length.has_value()) { | ^~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:29:73: error: request for member ‘value’ in ‘((std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>*)(& obj))->std::__shared_ptr_access<StringBase, __gnu_cxx::_S_atomic, false, false>::operator->()->StringBase::<anonymous>.TypeBase<StringBase>::min_length’, which is of non-class type ‘int64_t’ {aka ‘long int’} 29 | min_length = std::max(0LL, static_cast<int64_t>(obj->min_length.value())); | ^~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp: At global scope: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: error: no declaration matches ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ 48 | std::vector<std::shared_ptr<StringBase>> StringLengthVariance::get_mutated_elements() { | ^~~~~~~~~~~~~~~~~~~~ /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:48:42: note: no functions named ‘std::vector<std::shared_ptr<StringBase> > StringLengthVariance::get_mutated_elements()’ In file included from /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.cpp:6: /data/k50048780/cpp_mutator/mutators/string/StringLengthVariance.h:13:7: note: ‘class StringLengthVariance’ defined here 13 | class StringLengthVariance : public IntegerVariance { | ^~~~~~~~~~~~~~~~~~~~
07-01
std::vector<uint32_t> StringUtf8ExtraBytes::encode_string(std::string& input, std::vector<int>& indices, int seed = 0) { std::default_random_engine rand_engine(seed); std::uniform_int_distribution<int> dist(0); std::vector<uint32_t> result; for (size_t i = 0; i < input.size(); ++i) { char32_t ch = input[i]; uint32_t code_point = static_cast<uint32_t>(ch); int byte_count = ENCODE::get_byte_count(code_point); int mutated_count = byte_count; std::vector<uint32_t > encoded; bool selected_mutate = false; for (int idx : indices) { if (static_cast<size_t>(idx) == i + 1) { selected_mutate = true; break; } } if (selected_mutate) { std::uniform_int_distribution<int> mutation_dist(byte_count + 1, 6); mutated_count = mutation_dist(rand_engine); } switch (mutated_count) { case 1: encoded.push_back(static_cast<uint8_t>(code_point)); break; case 2: encoded.push_back(0xC0 | ((code_point >> 6) & 0x1F)); encoded.push_back(0x80 | (code_point & 0x3F)); break; case 3: encoded.push_back(0xE0 | ((code_point >> 12) & 0x0F)); encoded.push_back(0x80 | ((code_point >> 6) & 0x3F)); encoded.push_back(0x80 | (code_point & 0x3F)); break; case 4: encoded.push_back(0xF0 | ((code_point >> 18) & 0x07)); encoded.push_back(0x80 | ((code_point >> 12) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 6) & 0x3F)); encoded.push_back(0x80 | (code_point & 0x3F)); break; case 5: encoded.push_back(0xF8 | ((code_point >> 24) & 0x03)); encoded.push_back(0x80 | ((code_point >> 18) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 12) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 6) & 0x3F)); encoded.push_back(0x80 | (code_point & 0x3F)); break; case 6: encoded.push_back(0xFC | ((code_point >> 30) & 0x01)); encoded.push_back(0x80 | ((code_point >> 24) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 18) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 12) & 0x3F)); encoded.push_back(0x80 | ((code_point >> 6) & 0x3F)); encoded.push_back(0x80 | (code_point & 0x3F)); break; default: throw std::runtime_error("Unsupported value"); } result.insert(result.end(), encoded.begin(), encoded.end()); } return result; }转化为返回值是uint8_t安全吗
07-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值