#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 {
| ^~~~~~~~~~~~~~~~~~~~
最新发布