(self, fmtstr_ptr)
return fmt_str
Parse format strings.

        :param fmt_idx: The pointer to the format string from the arguments list.
        :returns:       A FormatString object which can be used for replacing the format specifiers with arguments or
                        for scanning into arguments.
Parse format strings.
Parse format strings .
def _parse(self, fmtstr_ptr):
        """
        Parse format strings.

        :param fmt_idx: The pointer to the format string from the arguments list.
        :returns:       A FormatString object which can be used for replacing the format specifiers with arguments or
                        for scanning into arguments.
        """

        if self.state.solver.symbolic(fmtstr_ptr):
            raise SimProcedureError("Symbolic pointer to (format) string :(")

        length = self._sim_strlen(fmtstr_ptr)
        if self.state.solver.symbolic(length):
            all_lengths = self.state.solver.eval_upto(length, 2)
            if len(all_lengths) != 1:
                raise SimProcedureError("Symbolic (format) string, game over :(")
            length = all_lengths[0]

        if self.state.solver.is_true(length == 0):
            return FormatString(self, [b""])

        fmt_xpr = self.state.memory.load(fmtstr_ptr, length)

        fmt = [ ]
        for i in range(fmt_xpr.size(), 0, -8):
            char = fmt_xpr[i - 1 : i - 8]
            try:
                conc_char = self.state.solver.eval_one(char)
            except SimSolverError:
                # For symbolic chars, just keep them symbolic
                fmt.append(char)
            else:
                # Concrete chars are directly appended to the list
                fmt.append(bytes([conc_char]))

        # make a FormatString object
        fmt_str = self._get_fmt(fmt)

        l.debug("Fmt: %r", fmt_str)

        return fmt_str
def _parse ( self , fmtstr_ptr ) : if self . state . solver . symbolic ( fmtstr_ptr ) : raise SimProcedureError ( "Symbolic pointer to (format) string :(" ) length = self . _sim_strlen ( fmtstr_ptr ) if self . state . solver . symbolic ( length ) : all_lengths = self . state . solver . eval_upto ( length , 2 ) if len ( all_lengths ) != 1 : raise SimProcedureError ( "Symbolic (format) string, game over :(" ) length = all_lengths [ 0 ] if self . state . solver . is_true ( length == 0 ) : return FormatString ( self , [ b"" ] ) fmt_xpr = self . state . memory . load ( fmtstr_ptr , length ) fmt = [ ] for i in range ( fmt_xpr . size ( ) , 0 , - 8 ) : char = fmt_xpr [ i - 1 : i - 8 ] try : conc_char = self . state . solver . eval_one ( char ) except SimSolverError : # For symbolic chars, just keep them symbolic fmt . append ( char ) else : # Concrete chars are directly appended to the list fmt . append ( bytes ( [ conc_char ] ) ) # make a FormatString object fmt_str = self . _get_fmt ( fmt ) l . debug ( "Fmt: %r" , fmt_str ) return fmt_str