Skip to content
This repository was archived by the owner on Feb 17, 2025. It is now read-only.

Commit c1cad6c

Browse files
akokoshnakokoshn
akokoshn
authored andcommitted
Avoid using std::optional for maybe uninitialized variables
1 parent d0f3289 commit c1cad6c

File tree

5 files changed

+26
-28
lines changed

5 files changed

+26
-28
lines changed

include/nil/blueprint/assigner.hpp

+14-20
Original file line numberDiff line numberDiff line change
@@ -731,22 +731,14 @@ namespace nil {
731731
size_t num_cells = layout_resolver->get_cells_num<BlueprintFieldType>(dest->getType());
732732
if (num_cells == 1) {
733733
auto &cell = memory[ptr];
734-
if(!cell.v.has_value()) {
735-
log.debug(boost::format("Load uninitialized var %1% = 0") % ptr);
736-
cell.v = zero_var;
737-
}
738-
var v = cell.v.value();
739-
frame.scalars[dest] = v;
734+
ASSERT_MSG(detail::is_initialized(cell.v), "Load uninitialized var");
735+
frame.scalars[dest] = cell.v;
740736
} else {
741737
std::vector<var> res;
742738
for (size_t i = 0; i < num_cells; ++i) {
743739
auto &cell = memory[ptr + i];
744-
if(!cell.v.has_value()) {
745-
log.debug(boost::format("Load uninitialized var %1% = 0") % (ptr + i));
746-
cell.v = zero_var;
747-
}
748-
var v = cell.v.value();
749-
res.push_back(v);
740+
ASSERT_MSG(detail::is_initialized(cell.v), "Load uninitialized var");
741+
res.push_back(cell.v);
750742
}
751743
frame.vectors[dest] = res;
752744
}
@@ -981,30 +973,30 @@ namespace nil {
981973
if (i < false_memory_region_end && i < true_memory_region_end) {
982974
auto v_true = is_stack ? state.stack[i - memory_region_begin].v : state.heap[i - memory_region_begin].v;
983975
auto v_false = memory[i].v;
984-
if (v_true.has_value() && v_false.has_value()) {
985-
if (!detail::is_internal<var>(v_true.value()) && !detail::is_internal<var>(v_false.value())) {
976+
if (detail::is_initialized(v_true) && detail::is_initialized(v_false)) {
977+
if (!detail::is_internal<var>(v_true) && !detail::is_internal<var>(v_false)) {
986978
// cell exist and contains real var in both state and current memory, so merged result = select(cond, state var, current memory var)
987979
memory.store(i, create_select_component<BlueprintFieldType, var>(
988-
cond, v_true.value(), v_false.value(), circuits[currProverIdx], assignments[currProverIdx], internal_storage, statistics, param, one_var));
980+
cond, v_true, v_false, circuits[currProverIdx], assignments[currProverIdx], internal_storage, statistics, param, one_var));
989981
} else {
990982
typename BlueprintFieldType::value_type res_value = 0;
991983
if (gen_mode.has_assignments()) {
992-
res_value = (get_var_value(cond) != res_value) ? get_var_value(v_true.value()) : get_var_value(v_false.value());
984+
res_value = (get_var_value(cond) != res_value) ? get_var_value(v_true) : get_var_value(v_false);
993985
}
994986
// cell exist in both state and current memory, but contains internal var, so merged result = internal var
995987
var internal_select_res = put_value_into_internal_storage(res_value);
996988
memory.store(i, internal_select_res);
997989
}
998-
} else if (v_true.has_value()) {
990+
} else if (detail::is_initialized(v_true)) {
999991
// cell exist in both state and current memory, but only state_var has value, so merged result = state_var
1000-
memory.store(i, v_true.value());
992+
memory.store(i, v_true);
1001993
}
1002994
// otherwise merge result = current_memory var
1003995
} else if (i < true_memory_region_end) {
1004996
auto v_true = is_stack ? state.stack[i - memory_region_begin].v : state.heap[i - memory_region_begin].v;
1005-
if (v_true.has_value()) {
997+
if (detail::is_initialized(v_true)) {
1006998
// cell exist only in state, so merged result = state_var
1007-
memory.store(i, v_true.value());
999+
memory.store(i, v_true);
10081000
}
10091001
}
10101002
// otherwise merge result = current_memory var
@@ -1564,12 +1556,14 @@ namespace nil {
15641556
extract_inst->getAggregateOperand()->getType(), extract_inst->getIndices())
15651557
.second;
15661558
var v = memory.load(ptr);
1559+
ASSERT(detail::is_initialized(v));
15671560
frame.scalars[inst] = v;
15681561
return inst->getNextNonDebugInstruction();
15691562
}
15701563
case llvm::Instruction::IndirectBr: {
15711564
ptr_type ptr = resolve_number<ptr_type>(frame, inst->getOperand(0));
15721565
var bb_var = memory.load(ptr);
1566+
ASSERT(detail::is_initialized(bb_var));
15731567
llvm::BasicBlock *bb = (llvm::BasicBlock *)(resolve_number<uintptr_t>(bb_var));
15741568
ASSERT(labels.find(bb) != labels.end());
15751569
return &bb->front();

include/nil/blueprint/extract_constructor_parameters.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ namespace nil {
8787
for (std::size_t i = 0; i < input_length; i++) {
8888
ASSERT(memory[input_ptr].size == (BlueprintFieldType::number_bits + 7) / 8);
8989
auto v = memory.load(input_ptr++);
90+
ASSERT(detail::is_initialized<var>(v));
9091
res.push_back(v);
9192
}
9293
return res;

include/nil/blueprint/handle_component.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ namespace nil {
212212
BOOST_LOG_TRIVIAL(trace) << "input var: " << v.get() << " " << var_value(assignment, v.get()).data;
213213

214214
// component input can't be from internal_storage'
215-
ASSERT(!detail::is_internal<var>(v.get()));
215+
ASSERT(!detail::is_internal<var>(v.get()) && detail::is_initialized<var>(v.get()));
216216
if ((used_rows.find(v.get().rotation) == used_rows.end()) &&
217217
(v.get().type == var::column_type::witness || v.get().type == var::column_type::constant)) {
218218
var new_v;

include/nil/blueprint/memory.hpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ namespace nil {
4040

4141
template<typename VarType>
4242
struct cell {
43-
std::optional<VarType> v;
43+
VarType v;
4444
size_t offset;
4545
int8_t size;
4646
int8_t following;
@@ -59,9 +59,9 @@ namespace nil {
5959
struct program_memory : public std::vector<cell<VarType>> {
6060
public:
6161
program_memory(size_t stack_size) : stack_size(stack_size), heap_top(stack_size) {
62-
this->push_back({std::nullopt, 0, 0});
62+
this->push_back({VarType(), 0, 0});
6363
this->resize(heap_top);
64-
this->push_back({std::nullopt, stack_size + 1, 0});
64+
this->push_back({VarType(), stack_size + 1, 0});
6565
heap_top++;
6666
push_frame();
6767
}
@@ -93,7 +93,7 @@ namespace nil {
9393
auto offset = this->back().offset + this->back().size;
9494
ptr_type res = this->size();
9595
for (size_t i = 0; i < num_bytes; ++i) {
96-
this->push_back(cell<VarType>{std::nullopt, offset++, 1});
96+
this->push_back(cell<VarType>{VarType(), offset++, 1});
9797
heap_top++;
9898
}
9999
return res;
@@ -104,9 +104,7 @@ namespace nil {
104104
}
105105

106106
VarType load(ptr_type ptr) {
107-
auto maybe_v = (*this)[ptr].v;
108-
ASSERT(maybe_v.has_value());
109-
return maybe_v.value();
107+
return (*this)[ptr].v;
110108
}
111109

112110
size_t ptrtoint(ptr_type ptr) {

include/nil/blueprint/utilities.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,11 @@ namespace nil {
143143
}
144144
return false;
145145
}
146+
147+
template<typename var>
148+
bool is_initialized(const var &v) {
149+
return (v.type != var::column_type::uninitialized);
150+
}
146151
} // namespace detail
147152
} // namespace blueprint
148153
} // namespace nil

0 commit comments

Comments
 (0)