def symbolicate_buffer(self, data, label='<STR_LIT>', wildcard='<STR_LIT:+>', string=False, taint=frozenset()):
if wildcard in data:<EOL><INDENT>size = len(data)<EOL>symb = self._constraints.new_array(name=label, index_max=size, taint=taint, avoid_collisions=True)<EOL>self._input_symbols.append(symb)<EOL>tmp = []<EOL>for i in range(size):<EOL><INDENT>if data[i] == wildcard:<EOL><INDENT>tmp.append(symb[i])<EOL><DEDENT>else:<EOL><INDENT>tmp.append(data[i])<EOL><DEDENT><DEDENT>data = tmp<EOL><DEDENT>if string:<EOL><INDENT>for b in data:<EOL><INDENT>if issymbolic(b):<EOL><INDENT>self._constraints.add(b != <NUM_LIT:0>)<EOL><DEDENT>else:<EOL><INDENT>assert b != <NUM_LIT:0><EOL><DEDENT><DEDENT><DEDENT>return data<EOL>
Mark parts of a buffer as symbolic (demarked by the wildcard byte)

        :param str data: The string to symbolicate. If no wildcard bytes are provided,
                this is the identity function on the first argument.
        :param str label: The label to assign to the value
        :param str wildcard: The byte that is considered a wildcard
        :param bool string: Ensure bytes returned can not be NULL
        :param taint: Taint identifier of the symbolicated data
        :type taint: tuple or frozenset

        :return: If data does not contain any wildcard bytes, data itself. Otherwise,
            a list of values derived from data. Non-wildcard bytes are kept as
            is, wildcard bytes are replaced by Expression objects.