コード例 #1
0
static int GetTypeOf(ea_t ea)
{
	flags_t flags = getFlags(ea);

	if (isTail(flags)) {
		// check if it's a struct ptr
		ea_t head = get_item_head(ea);
		if (head == ea) return T_UNK;
		flags = getFlags(head);
		if (!isData(flags) || !isStruct(flags)) return T_UNK;
		return GetTypeOfStructInstance(ea, head, flags);
	}

	if (!isData(flags)) return T_UNK;
	
	if (isStruct(flags)) return GetTypeOfStructInstance(ea, ea, flags);

	if (isByte(flags)) {
		char s;
		if (has_cmt(flags) && (get_cmt(ea, false, &s, 1) != -1) && s == 'S') return T_I8;
		return T_U8;
	}
	if (isWord(flags)) {
		char s;
		if (has_cmt(flags) && (get_cmt(ea, false, &s, 1) != -1) && s == 'S') return T_I16;
		return T_U16;
	}
	if (isDwrd(flags))  return T_I32;

	return T_UNK;
}
void NonPrivateMemberVariablesInClassesCheck::registerMatchers(
    MatchFinder *Finder) {
  if (!getLangOpts().CPlusPlus)
    return;

  // We can ignore structs/classes with all member variables being public.
  auto ShouldIgnoreRecord =
      allOf(boolean(IgnoreClassesWithAllMemberVariablesBeingPublic),
            unless(hasNonPublicMemberVariable()));

  // There are three visibility types: public, protected, private.
  // If we are ok with public fields, then we only want to complain about
  // protected fields, else we want to complain about all non-private fields.
  // We can ignore public member variables in structs/classes, in unions.
  auto InterestingField = fieldDecl(
      IgnorePublicMemberVariables ? isProtected() : unless(isPrivate()));

  // We only want the records that not only contain the mutable data (non-static
  // member variables), but also have some logic (non-static member functions).
  // We may optionally ignore records where all the member variables are public.
  Finder->addMatcher(cxxRecordDecl(anyOf(isStruct(), isClass()), hasMethods(),
                                   hasNonStaticMethod(),
                                   unless(ShouldIgnoreRecord),
                                   forEach(InterestingField.bind("field")))
                         .bind("record"),
                     this);
}
コード例 #3
0
ファイル: MxArray.cpp プロジェクト: ivalab/mexopencv
std::string MxArray::fieldname(int fieldnumber) const
{
    if (!isStruct())
        mexErrMsgIdAndTxt("mexopencv:error", "MxArray is not struct");
    const char *fname = mxGetFieldNameByNumber(p_, fieldnumber);
    if (!fname)
        mexErrMsgIdAndTxt("mexopencv:error",
            "Failed to get field name at %d\n", fieldnumber);
    return std::string(fname);
}
コード例 #4
0
ファイル: MxArray.cpp プロジェクト: demarlio25/mexopencv
std::vector<std::string> MxArray::fieldnames() const
{
    if (!isStruct())
        mexErrMsgIdAndTxt("mexopencv:error", "MxArray is not a struct array");
    int n = nfields();
    std::vector<std::string> v;
    v.reserve(n);
    for (int i = 0; i < n; ++i)
        v.push_back(fieldname(i));
    return v;
}
コード例 #5
0
void CloexecAcceptCheck::registerMatchers(MatchFinder *Finder) {
  auto SockAddrPointerType =
      hasType(pointsTo(recordDecl(isStruct(), hasName("sockaddr"))));
  auto SockLenPointerType = hasType(pointsTo(namedDecl(hasName("socklen_t"))));

  registerMatchersImpl(Finder,
                       functionDecl(returns(isInteger()), hasName("accept"),
                                    hasParameter(0, hasType(isInteger())),
                                    hasParameter(1, SockAddrPointerType),
                                    hasParameter(2, SockLenPointerType)));
}
コード例 #6
0
ファイル: MxArray.cpp プロジェクト: ivalab/mexopencv
MxArray MxArray::at(const std::string& fieldName, mwIndex index) const
{
    if (!isStruct())
        mexErrMsgIdAndTxt("mexopencv:error", "MxArray is not struct");
    if (numel() <= index)
        mexErrMsgIdAndTxt("mexopencv:error", "Index out of range");
    const mxArray* pm = mxGetField(p_, index, fieldName.c_str());
    if (!pm)
        mexErrMsgIdAndTxt("mexopencv:error",
            "Field '%s' doesn't exist", fieldName.c_str());
    return MxArray(pm);
}
コード例 #7
0
ファイル: Matlab.cpp プロジェクト: voxie-viewer/voxie
 void MatlabObject::checkScalar () const {
   ASSERT (!isStruct ());
   ASSERT (!isEmpty ());
   size_t ndims = size ().size ();
   if (ndims == 0) {
     return;
   } else if (ndims == 1) {
     ASSERT (size ()[0] == 1);
   } else if (ndims == 2) {
     ASSERT (size ()[0] == 1 && size ()[1] == 1);
   } else {
     ABORT_MSG ("ndims is larger than 2");
   }
 }
コード例 #8
0
ファイル: ShaderVars.cpp プロジェクト: google/angle
unsigned int ShaderVariable::getBasicTypeElementCount() const
{
    // GLES 3.1 Nov 2016 section 7.3.1.1 page 77 specifies that a separate entry should be generated
    // for each array element when dealing with an array of arrays or an array of structs.
    ASSERT(!isArrayOfArrays());
    ASSERT(!isStruct() || !isArray());

    // GLES 3.1 Nov 2016 page 82.
    if (isArray())
    {
        return getOutermostArraySize();
    }
    return 1u;
}
コード例 #9
0
ファイル: MxArray.cpp プロジェクト: demarlio25/mexopencv
std::vector<cv::DMatch> MxArray::toVector() const
{
    int n = numel();
    std::vector<cv::DMatch> v;
    v.reserve(n);
    if (isCell())
        for (int i = 0; i < n; ++i)
            v.push_back(at<MxArray>(i).toDMatch());
    else if (isStruct())
        for (int i = 0; i < n; ++i)
            v.push_back(toDMatch(i));
    else
        mexErrMsgIdAndTxt("mexopencv:error",
                          "MxArray unable to convert to std::vector");
    return v;
}
コード例 #10
0
ファイル: MxArray.cpp プロジェクト: ivalab/mexopencv
std::vector<cv::KeyPoint> MxArray::toVector() const
{
    const mwSize n = numel();
    std::vector<cv::KeyPoint> v;
    v.reserve(n);
    if (isCell())
        for (mwIndex i = 0; i < n; ++i)
            v.push_back(at<MxArray>(i).toKeyPoint());
    else if (isStruct())
        for (mwIndex i = 0; i < n; ++i)
            v.push_back(toKeyPoint(i));
    else
        mexErrMsgIdAndTxt("mexopencv:error",
            "MxArray unable to convert to std::vector<cv::KeyPoint>");
    return v;
}
コード例 #11
0
ファイル: DataMemberChecker.cpp プロジェクト: davidho95/SAS
void DataMemberChecker::checkASTDecl(const clang::FieldDecl* D,
                                clang::ento::AnalysisManager& Mgr,
                                clang::ento::BugReporter& BR) const {
  const char *reportDescription = "[sas.CodingConventions.FCCSW.DataMember] Data member variable names must begin with 'm_' followed by a lowerCamelCase name.";
  std::regex correctRegex("^m_[a-z][a-zA-Z0-9]+");
  auto nameString = D->getNameAsString();
  auto parent = D->getParent();

  if (parent->isStruct()) {
      return;
      // Does not apply to public members of structs
  }

  if (!std::regex_match(nameString, correctRegex)) {
    Report(D, reportDescription, BR);
  }
  
}
コード例 #12
0
ファイル: Var.cpp プロジェクト: Chingliu/poco
Var& Var::getAt(std::size_t n)
{
	if (isVector())
		return holderImpl<std::vector<Var>,
			InvalidAccessException>("Not a vector.")->operator[](n);
	else if (isList())
		return holderImpl<std::list<Var>,
			InvalidAccessException>("Not a list.")->operator[](n);
	else if (isDeque())
		return holderImpl<std::deque<Var>,
			InvalidAccessException>("Not a deque.")->operator[](n);
	else if (isStruct())
		return structIndexOperator(holderImpl<Struct<int>,
			InvalidAccessException>("Not a struct."), static_cast<int>(n));
	else if (!isString() && !isEmpty() && (n == 0))
		return *this;
	
	throw RangeException("Index out of bounds.");
}
コード例 #13
0
ファイル: Uniform.cpp プロジェクト: Heikki00/DareEngine2
void Uniform::loadLocation(){

	if (glIsProgram(shader) == GL_FALSE){
		DebugUtility::log_err("ERROR: Called loadLocation of uniform %s before its shader was successfully linked\n", name.c_str());
		return;
	}

	if (!isStruct()){

		
		std::string realName = getRealName();
		

		location = glGetUniformLocation(shader, realName.c_str());


		if (location == -1u) {
			DebugUtility::log_err("ERROR: Failed to load location of uniform %s\n", realName.c_str());
			

		}
		else{
			
		}


	}

	else {
	
		for (auto c : children){
			c->loadLocation();
		}


	}

}
コード例 #14
0
ファイル: strings1.cpp プロジェクト: IDA-RE-things/StructDump
void enum_members2(struc_t *st)
{
  char buf[MAXSTR];
  type_t type[MAXSTR] = {0};
  int gap_cnt = 1;

  asize_t ofs = 0, gapend = BADADDR, gapstart = BADADDR;

  for (size_t i=0;i<st->memqty;i++)
  {
    member_t &mem = st->members[i];

    // unexpected beginning of member?
    if (mem.soff != ofs)
    {
//      msg("gap detected @ %a!\n", ofs);
      gapstart = ofs;
    }

    if (gapstart != BADADDR)
    {
      gapend = mem.soff;
      msg("char pad%d[%d]\n", gap_cnt, gapend - gapstart);
      //msg("gap size=%a\n", gapend - gapstart);
      gapend = gapstart = BADADDR;
      gap_cnt++;
    }

    typeinfo_t mem_ti;
    retrieve_member_info(&mem, &mem_ti);

    // data type size of member
    asize_t dt_mem_size = get_data_type_size(mem.flag, &mem_ti);

    // member size
    asize_t mem_size = get_member_size(&mem);

    // get the member's name
    get_member_name(mem.id, buf, sizeof(buf));

    char dtype[MAXSTR];
    char arraystr[MAXSTR];
    char typemod[10];

    arraystr[0] = 0;
    typemod[0] = 0;

    if (isWord(mem.flag))
      strcpy(dtype, "unsigned short");
    else if (isDwrd(mem.flag))
      strcpy(dtype, "unsigned long");
    else if (isByte(mem.flag))
      strcpy(dtype, "char");
    else if (isStruct(mem.flag))
    {
      struc_t *nested_st = get_sptr(&mem);

      get_struc_name(nested_st->id, dtype, MAXSTR);
    }
    else 
      strcpy(dtype, "user_type");

    if (isOff0(mem.flag))
    {
      strcpy(typemod, "*");
    }

    if (isEnum0(mem.flag))
    {
      get_enum_name(mem_ti.ec.tid, dtype, sizeof(dtype));
    }

    asize_t ar_size = mem_size / dt_mem_size;

    // an array?
    if (ar_size > 1)
    {
      sprintf(arraystr, "[%d]", ar_size);
    }

    char out[100];
    sprintf(out, "%s " /* type */

                 "%s" /* typemodif */ "%s" /* varname */ "%s" /*array*/ ";", dtype, typemod, buf, arraystr);
    msg("%s\n", out);


/*
inline bool idaapi isByte  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_BYTE; }
inline bool idaapi isWord  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_WORD; }
inline bool idaapi isDwrd  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_DWRD; }
inline bool idaapi isQwrd  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_QWRD; }
inline bool idaapi isOwrd  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_OWRD; }
inline bool idaapi isTbyt  (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_TBYT; }
inline bool idaapi isFloat (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_FLOAT; }
inline bool idaapi isDouble(flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_DOUBLE; }
inline bool idaapi isPackReal(flags_t F) { return isData(F) && (F & DT_TYPE) == FF_PACKREAL; }
inline bool idaapi isASCII (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_ASCI; }
inline bool idaapi isStruct(flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_STRU; }
inline bool idaapi is3byte (flags_t F)   { return isData(F) && (F & DT_TYPE) == FF_3BYTE; }

*/
    /*
    msg("member[%d], name=%s; %a-%a ; id=%d; flags=%x type=%s dt_mem_size=%a mem_size=%a\n", 
      i, 
      buf, 
      mem.soff, 
      mem.eoff, 
      mem.id, 
      mem.flag,
      type,
      dt_mem_size,
      mem_size);
    */
    // we expect next member to begin @ end of last member
    ofs = mem.eoff;
  }
}
コード例 #15
0
ファイル: cvutil.cpp プロジェクト: Pascal-78/cv2pdb
bool isCompleteStruct(const codeview_type* type, const BYTE* name, bool cstr)
{
	return isStruct(type) 
		&& !(getStructProperty(type) & kPropIncomplete)
		&& cmpStructName(type, name, cstr);
}
コード例 #16
0
matvar_t *GetMatlabVariable(void *pvApiCtx, int iVar, const char *name, int matfile_version, int * parent, int item_position)
{
    int * var_addr = NULL;
    int var_type;
    SciErr sciErr;
    matvar_t * tmp_res = NULL;

    if (parent == NULL)
    {
        sciErr = getVarAddressFromPosition(pvApiCtx, iVar, &var_addr);
        if (sciErr.iErr)
        {
            printError(&sciErr, 0);
            return NULL;
        }
        sciErr = getVarType(pvApiCtx, var_addr, &var_type);
        if (sciErr.iErr)
        {
            printError(&sciErr, 0);
            return NULL;
        }
    }
    else
    {
        sciErr = getListItemAddress(pvApiCtx, parent, item_position, &var_addr);
        if (sciErr.iErr)
        {
            printError(&sciErr, 0);
            return NULL;
        }
        sciErr = getVarType(pvApiCtx, var_addr, &var_type);
        if (sciErr.iErr)
        {
            printError(&sciErr, 0);
            return NULL;
        }
    }

    switch (var_type)
    {
        case sci_matrix:
            tmp_res = GetDoubleVariable(pvApiCtx, iVar, name, matfile_version, parent, item_position);
            break;
        case sci_strings:
            tmp_res = GetCharVariable(pvApiCtx, iVar, name, parent, item_position);
            break;
        case sci_ints:
            tmp_res = GetIntegerVariable(pvApiCtx, iVar, name, parent, item_position);
            break;
        case sci_mlist:
            /* Only cells structs and hypermatrices are managed */
            if (isCell(pvApiCtx, var_addr))
            {
                tmp_res = GetCellVariable(pvApiCtx, iVar, name, matfile_version, parent, item_position);
            }
            else if (isStruct(pvApiCtx, var_addr))
            {
                tmp_res = GetStructVariable(pvApiCtx, iVar, name, matfile_version, parent, item_position);
            }
            else
            {
                if (item_position > 0)
                {
                    tmp_res = GetMlistVariable(pvApiCtx, iVar, name, matfile_version, parent, item_position);
                }
                else
                {
                    tmp_res = GetMlistVariable(pvApiCtx, iVar, name, matfile_version, parent, -1);
                }
            }
            break;
        case sci_sparse:
            if (item_position > 0)
            {
                tmp_res = GetSparseVariable(pvApiCtx, iVar, name, parent, item_position);
            }
            else
            {
                tmp_res = GetSparseVariable(pvApiCtx, iVar, name, parent, -1);
            }
            break;
        default:
            sciprint("Do not known how to get variable of type %d\n", var_type);
            tmp_res = NULL;
    }

    return tmp_res;
}
コード例 #17
0
ファイル: type_utils.cpp プロジェクト: zmanchun/insieme
	/// TODO: add trivial marker for tagtypes
	bool isTrivial(const TypePtr& type) {
		auto ttype = type.isa<TagTypePtr>();
		if(!ttype) {
			if (core::lang::isArray(type)) {
				// in case of an array, check the enclosed type for triviality
				return isTrivial(core::lang::ArrayType(type).getElementType());
			}
			// non-tag-type & non-array types are always trivial
			return true;
		}

		auto record = ttype->getRecord();

		IRBuilder builder(type->getNodeManager());

		auto containsCtor = [&](const LambdaExprPtr& ctor)->bool {
			return any(record->getConstructors(), [&](const ExpressionPtr& cur) {
				return *builder.normalize(cur) == *builder.normalize(ctor);
			});
		};

		auto containsMemberFunction = [&](const MemberFunctionPtr& member)->bool {
			return any(record->getMemberFunctions(), [&](const MemberFunctionPtr& cur) {
				return *builder.normalize(cur) == *builder.normalize(member);
			});
		};

		auto thisType = builder.refType(builder.tagTypeReference(record->getName()));

		ParentsPtr parents =
				(record.isa<StructPtr>()) ?
				record.as<StructPtr>()->getParents() :
				builder.parents();

		// check for trivial constructors
		bool trivialDefaultConstructor = containsCtor(builder.getDefaultConstructor(thisType, parents, record->getFields()));
		if (!trivialDefaultConstructor) return false;

		bool trivialCopyConstructor = containsCtor(builder.getDefaultCopyConstructor(thisType, parents, record->getFields()));
		if (!trivialCopyConstructor) return false;

		bool trivialMoveConstructor = containsCtor(builder.getDefaultMoveConstructor(thisType, parents, record->getFields()));
		if (!trivialMoveConstructor) return false;


		// check for trivial copy and move assignments
		bool trivialCopyAssignment = containsMemberFunction(builder.getDefaultCopyAssignOperator(thisType, parents, record->getFields()));
		if (!trivialCopyAssignment) return false;

		bool trivialMoveAssignment = containsMemberFunction(builder.getDefaultMoveAssignOperator(thisType, parents, record->getFields()));
		if (!trivialMoveAssignment) return false;

		// check for trivial, non-virtual destructor
		if(record->getDestructor().as<LambdaExprPtr>()->getBody().size() != 0 || record->getDestructorVirtual().getValue()) return false;

		// check for virtual member functions
		for(auto memFun : record->getMemberFunctions()) {
			if(memFun->getVirtualFlag().getValue()) return false;
		}

		if(!record->getPureVirtualMemberFunctions().empty()) return false;

		// check for virtual & non-trivial base classes
		if(ttype->isStruct()) {
			auto stype = ttype->getStruct();
			for(auto par : stype->getParents()) {
				if(par->getVirtual().getValue()) return false;
				// if our direct base class is non-trivial, we cannot be trivial per-se
				if(!isTrivial(par->getType())) return false;
			}
		}

		// check that all non-static members are trivial
		for(auto field : record->getFields()) {
			auto fieldType = field->getType();
			if(!isTrivial(fieldType)) return false;
			//check cpp_ref field types
			if(analysis::isRefType(fieldType) && lang::isCppReference(fieldType)) {
				//TODO this is an over approximation which has to be refined
				return false;
			}
		}

		return true;
	}