//
// 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;
| ^~~~~~~~~~~