bool is_number(const typet &type) { const std::string &id=type.id_string(); return id=="rational" || id=="real" || id=="integer" || id=="natural" || id=="complex" || id=="unsignedbv" || id=="signedbv" || id=="floatbv" || id=="fixedbv"; }
exprt gen_zero(const typet &type) { exprt result; const std::string type_id=type.id_string(); result=exprt("constant", type); if(type_id=="rational" || type_id=="real" || type_id=="integer" || type_id=="natural" || type_id=="complex") { result.value("0"); } else if(type_id=="unsignedbv" || type_id=="signedbv" || type_id=="floatbv" || type_id=="fixedbv" || type_id=="c_enum") { std::string value; unsigned width=bv_width(type); for(unsigned i=0; i<width; i++) value+='0'; result.value(value); } else if(type_id=="bool") { result.make_false(); } else if(type_id=="pointer") { result.value("NULL"); } else result.make_nil(); return result; }
exprt gen_one(const typet &type) { const std::string &type_id=type.id_string(); exprt result=exprt("constant", type); if(type_id=="bool" || type_id=="rational" || type_id=="real" || type_id=="integer" || type_id=="natural" || type_id=="complex") { result.value("1"); } else if(type_id=="unsignedbv" || type_id=="signedbv") { std::string value; for(int i=0; i<atoi(type.width().c_str())-1; i++) value+='0'; value+='1'; result.value(value); } else if(type_id=="fixedbv") { fixedbvt fixedbv; fixedbv.spec=to_fixedbv_type(type); fixedbv.from_integer(1); result=fixedbv.to_expr(); } else if(type_id=="floatbv") { std::cerr << "floatbv unsupported, sorry" << std::endl; abort(); } else result.make_nil(); return result; }
std::string type2name(const typet &type) { std::string result; // qualifiers first if(type.get_bool(ID_C_constant)) result+="c"; if(type.get_bool(ID_C_restricted)) result+="r"; if(type.get_bool(ID_C_volatile)) result+="v"; if(type.id()==irep_idt()) throw "Empty type encountered."; else if(type.id()==ID_empty) result+="V"; else if(type.id()==ID_signedbv) result+="S" + type.get_string(ID_width); else if(type.id()==ID_unsignedbv) result+="U" + type.get_string(ID_width); else if(type.id()==ID_bool) result+="B"; else if(type.id()==ID_integer) result+="I"; else if(type.id()==ID_real) result+="R"; else if(type.id()==ID_complex) result+="C"; else if(type.id()==ID_floatbv) result+="F" + type.get_string(ID_width); else if(type.id()==ID_fixedbv) result+="X" + type.get_string(ID_width); else if(type.id()==ID_natural) result+="N"; else if(type.id()==ID_pointer) result+="*"; else if(type.id()==ID_reference) result+="&"; else if(type.id()==ID_code) { const code_typet &t=to_code_type(type); const code_typet::argumentst arguments=t.arguments(); result+="P("; for(code_typet::argumentst::const_iterator it=arguments.begin(); it!=arguments.end(); it++) { result+=type2name(it->type()); result+="'" + id2string(it->get_identifier()) + "'|"; } result.resize(result.size()-1); result+=")"; } else if(type.id()==ID_array) { const array_typet &t=to_array_type(type); if(t.size().is_nil()) result+="ARR?"; else result+="ARR"+t.size().get_string(ID_value); } else if(type.id()==ID_symbol) { result+="SYM#"+type.get_string(ID_identifier)+"#"; } else if(type.id()==ID_struct || type.id()==ID_union) { if(type.id()==ID_struct) result+="ST"; if(type.id()==ID_union) result+="UN"; const struct_union_typet &t=to_struct_union_type(type); const struct_union_typet::componentst &components = t.components(); result+="["; for(struct_union_typet::componentst::const_iterator it=components.begin(); it!=components.end(); it++) { if(it!=components.begin()) result+="|"; result+=type2name(it->type()); result+="'"+it->get_string(ID_name)+"'|"; } result+="]"; } else if(type.id()==ID_incomplete_struct) result +="ST?"; else if(type.id()==ID_incomplete_union) result +="UN?"; else if(type.id()==ID_c_enum) result +="EN"+type.get_string(ID_width); else if(type.id()==ID_incomplete_c_enum) result +="EN?"; else if(type.id()==ID_c_bitfield) result+="BF"+type.get_string(ID_size); else if(type.id()==ID_vector) result+="VEC"+type.get_string(ID_size); else throw (std::string("Unknown type '") + type.id_string() + "' encountered."); if(type.has_subtype()) { result+="{"; result+=type2name(type.subtype()); result+="}"; } if(type.has_subtypes()) { result+="$"; forall_subtypes(it, type) { result+=type2name(*it); result+="|"; }
bool c_typecheck_baset::zero_initializer(exprt &value, const typet &type) const { const std::string &type_id = type.id_string(); if(type_id == "bool") { value.make_false(); return false; } if( type_id == "unsignedbv" || type_id == "signedbv" || type_id == "floatbv" || type_id == "fixedbv" || type_id == "pointer") { value = gen_zero(type); return false; } else if(type_id == "code") return false; else if(type_id == "c_enum" || type_id == "incomplete_c_enum") { value = exprt("constant", type); value.value(i2string(0)); return false; } else if(type_id == "array") { const array_typet &array_type = to_array_type(type); exprt tmpval; if(zero_initializer(tmpval, array_type.subtype())) return true; const exprt &size_expr = array_type.size(); if(size_expr.id() == "infinity") { } else { mp_integer size; if(to_integer(size_expr, size)) return true; // Permit GCC zero sized arrays; disallow negative sized arrays. // Cringe slightly when doing it though. if(size < 0) return true; } value = exprt("array_of", type); value.move_to_operands(tmpval); return false; } else if(type_id == "struct") { const irept::subt &components = type.components().get_sub(); value = exprt("struct", type); forall_irep(it, components) { exprt tmp; if(zero_initializer(tmp, (const typet &)it->type())) return true; value.move_to_operands(tmp); } return false; }