Funcíon siendo detecta por los antivirus

Iniciado por Progmasterbr, 8 Junio 2015, 03:17 AM

0 Miembros y 1 Visitante están viendo este tema.

Progmasterbr

hola,

tengo una función del un Stub en un joiner (Función "split") que está siendo detectado por antivirus en la siguiente línea:

V50 = V40

Esta línea es una de las más importantes de esta función

Por favor, alguien me podría ayudar con alguna modificación para esta función?

Segue lo código de la Funcíon:



Private Function Separa(ByVal V1 As String, Optional ByVal V2 As String, Optional ByVal V3 As Long = -1) As String()

Dim V40 As Long, V50 As Long, V6 As Long, V7 As Long, V8 As Long, V9() As String

V6 = Len(V1)

If V2 = vbNullString Then V2 = " "
V7 = Len(V2)

If V3 = 0 Then GoTo QuitHere
If V6 = 0 Then GoTo QuitHere
If InStr(1, V1, V2, vbBinaryCompare) = 0 Then GoTo QuitHere

ReDim V9(0)
V40 = 1
V50 = 1

Do
If V8 + 1 = V3 Then
V9(V8) = Mid$(V1, V40)
Exit Do
End If

V50 = InStr(V50, V1, V2, vbBinaryCompare)

If V50 = 0 Then
If Not V40 = V6 Then
V9(V8) = Mid$(V1, V40)
End If
Exit Do
End If

V9(V8) = Mid$(V1, V40, V50 - V40)
V8 = V8 + 1

ReDim Preserve V9(V8)

V40 = V50 + V7
V50 = V40
Loop

ReDim Preserve V9(V8)
Separa = V9

Exit Function

QuitHere:
ReDim Separa(-1 To -1)

End Function


pkj

#1
Puedes intentar modificar un poco la funcion.
A mi a veces me pasa tambien eso y mira que j.de.

Aqui te dejo tu funcion "traducida" y con un par de lineas cambiadas de posicion.
Quiza te valga, aunque no responde igual que Split con caracteres ASCII extendido.

Código (vb) [Seleccionar]

Private Function Separa(ByVal Cadena As String, Optional ByVal Separador As String, Optional ByVal Limite As Long = -1) As String()
 
 Dim SiguienteCaracter As Long, PosSeparador As Long, LenCadena As Long, LenSeparador As Long, Contador As Long, MatrizAcumulador() As String
 
 LenCadena = Len(Cadena)
 If LenCadena = 0 Then GoTo QuitHere
 If Separador = vbNullString Then Separador = " "
 If Limite = 0 Then GoTo QuitHere
 If InStr(1, Cadena, Separador, vbBinaryCompare) = 0 Then GoTo QuitHere

 
 LenSeparador = Len(Separador)
 
 ReDim MatrizAcumulador(0)
 SiguienteCaracter = 1
 PosSeparador = 1
 
 Do
   If Contador + 1 = Limite Then
     MatrizAcumulador(Contador) = Mid$(Cadena, SiguienteCaracter)
     Exit Do
   End If
   
   PosSeparador = InStr(PosSeparador, Cadena, Separador, vbBinaryCompare)
   
   If PosSeparador = 0 Then
     If Not SiguienteCaracter = LenCadena Then
       MatrizAcumulador(Contador) = Mid$(Cadena, SiguienteCaracter)
     End If
     Exit Do
   End If
   
   MatrizAcumulador(Contador) = Mid$(Cadena, SiguienteCaracter, PosSeparador - SiguienteCaracter)
   Contador = Contador + 1
   
   ReDim Preserve MatrizAcumulador(Contador)
   
   SiguienteCaracter = PosSeparador + LenSeparador
   PosSeparador = SiguienteCaracter
 Loop
 
 ReDim Preserve MatrizAcumulador(Contador)
 Separa = MatrizAcumulador
 
 Exit Function
 
QuitHere:
 ReDim Separa(-1 To -1)

End Function


Yo me he estado dejando un poco el seso y te he hecho esta otra, que aunque tarda 3 veces mas que la tuya, en miles y miles de pruebas aleatorias me ha dado el mismo resultado que Split.

Que la disfruteis:

Código (vb) [Seleccionar]
Private Function Separa3(ByVal Cadena As String, ByVal Separador As String, Optional ByVal Limite As Long = -1) As String()
 Dim Contador As Long
 Dim ContadorB As Long
 Dim F As Long
 Dim F2 As Long
 Dim Chr0 As Long
 Dim Matriz() As String
 Dim MatrizB() As Byte
 Dim CadenaB() As Byte
 Dim SeparadorB() As Byte
 Dim LenSepB As Long
 Dim LenCadenaB As Long
 
 ' EL ORDEN DE ESTAS COMPARACIONES ES IMPORTANTE
 ' PARA OBTENER EL MISMO RESULTADO QUE SPLIT
 ' PERO MUY, MUY IMPORTANTE :P
 LenCadenaB = LenB(Cadena)
 If Separador = "" Then GoTo Error2 ' si no hay separador se devuelve hasta un chr(0)
 If Limite = 0 Then GoTo Error1 ' si limite es 0 se devuelve vacia
 If LenCadenaB = 0 Then GoTo Error1 ' si no hay cadena se devuelve vacia
 If Limite = 1 Then GoTo Error3 ' si limite es 1 se devuelve todo en una matriz con 1 elemento
 If InStr(1, Cadena, Separador, vbBinaryCompare) = 0 Then GoTo Error3
 'si no se encuentra el separador se devuelve una matriz de 1 solo elemento con todo
 
 CadenaB = Cadena
 
 SeparadorB = Separador
 LenSepB = LenB(Separador)
 
 Contador = -1 ' este controla los elementos de Matriz
 ContadorB = 1 ' este controla los elementos de MatrizB
 
 For F = 0 To LenCadenaB - 1 Step 2 ' vamos eligiendo cada caracter
   
   If F + LenSepB <= LenCadenaB Then ' si cabe un separador miramos si lo hay
     For F2 = 0 To LenSepB - 1 Step 2
       If CadenaB(F + F2) <> SeparadorB(F2) Then
         Exit For ' no lo hay
       
       ElseIf CadenaB(F + F2 + 1) <> SeparadorB(F2 + 1) Then
         Exit For ' no lo hay
       
       End If
     Next F2
   
   Else
     
     ' si no cabe el separador, no hay separador. marcamos F2
     F2 = 0
   
   End If
   
   If F2 < LenSepB - 1 Then
   ' si no habia separador guardamos el byte
     ReDim Preserve MatrizB(ContadorB)
     MatrizB(ContadorB - 1) = CadenaB(F)
     MatrizB(ContadorB) = CadenaB(F + 1)
     ContadorB = ContadorB + 2
   
   Else
   ' si habia separador
     
     If Contador + 1 <> Limite Then
     ' si no hemos llegado al limite
       F = F + LenSepB - 2 ' apuntamos mas alla del separador
       Contador = Contador + 1 ' creamos un nuevo elemento y guardamos lo extraido
       ReDim Preserve Matriz(Contador)
       If ContadorB > 1 Then Matriz(Contador) = MatrizB
       ContadorB = 1 ' inicializamos la matrizb
       ReDim MatrizB(1)
     Else
     ' si hemos llegado al limite salimos
       Exit For
     End If
     
   End If
 Next F
   
 If (Contador + 1 = Limite) Then
   ' si estamos en el limite
     
   If F = LenCadenaB Then
    ' si hemos procesado toda la cadena, es que no habia
    ' separador y tenemos todo en matrizb, asi que lo
    ' guardamos en este ultimo elemento
     If ContadorB > 1 Then ' aun asi, el separador puede ser el ultimo caracter
       Matriz(Contador) = Matriz(Contador) & Separador & CStr(MatrizB)
     Else
       Matriz(Contador) = Matriz(Contador) & Separador
     End If
   
   Else
     ' si aun quedan caracteres es que habia separador
     ' hay que sacar los que quedan e incluir el separador
     For F2 = F To LenCadenaB - 1 Step 2
       ReDim Preserve MatrizB(ContadorB)
       MatrizB(ContadorB - 1) = CadenaB(F2)
       MatrizB(ContadorB) = CadenaB(F2 + 1)
       ContadorB = ContadorB + 2
     Next F2
     Matriz(Contador) = Matriz(Contador) & Separador & CStr(MatrizB)
     
   End If
 
 Else
   ' si quedan casillas creamos una nueva
   Contador = Contador + 1
   ReDim Preserve Matriz(Contador)
   ' si hay algo en matrizb lo guardamos
   If ContadorB > 2 Then Matriz(Contador) = MatrizB
 
 End If
   
 Separa3 = Matriz  ' y devolvemos la matriz

 GoTo FinFunction

Error1:
 ReDim Separa3(-1 To -1) ' aqui devolvemos la matriz vacia
 GoTo FinFunction
 
Error2:
 ' si no hay separador, Split usa chr(0) como fin de cadena.
 ' si no lo encuentra devuelve toda la cadena.
 Chr0 = InStr(1, Cadena, Chr(0))
 If Chr0 <> 0 Then
   Cadena = Left$(Cadena, Chr0 - 1)
 End If
 
Error3:
 ' aqui la devolvemos en un solo elemento
 ReDim Matriz(0)
 Matriz(0) = Cadena
 Separa3 = Matriz
 
FinFunction:

End Function


Saludos

EDITO:
Parece que me falto probar sin separador y si no lo hay no da el mismo resultado que Split.
Depurando.....

EDITO2:
Arreglado, (o eso creo). Espero que vaya bien, porque no pienso volver a revisarla.
La he probado con valores aleatorios y nulos para cadena, separador y limite.
Os dejo los comentarios que he ido escribiendo para que los mas nuevos se enteren de algo.

EDITO3:
Dios mio, porque lo he vuelto a revisar.
Por no hacer un Randomize, parece ser que las pruebas no eran del todo aleatorias.
Resulta que hay al menos 1 excepcion (que investigare), y es que si el caracter separador es el Chr(7) si que falla. Devuelve diferente resultado que la funcion Split.
Vere si lo arreglo. Si no, a mi ya me parece bastante bueno  :rolleyes:

Y SIGO EDITANDO:
El problema es el limite. Parece que si hay limite falla. No se que m,, de pruebas aleatorias he hecho :P
El caracter 7 me salia como separador siempre con limite 2, asi que siempre fallaba. Por lo visto como tenia un margen muy grande para limite, con los demas caracteres no llegaba al limite.
Seguire depurando a ver. Es mas complicado de lo que parece  :-\

OTRA VEZ AQUI:
Listo, ya funciona (otra vez). Solo habia un par de calculos que habia deducido mal. Volveré cuando vea que lo he estado probando todo el rato con la misma cadena o vete a saber :D

Y OTRA VEZ:
Ya lo adverti. Ahora habia olvidado probar con cadenas vacias (creo) y con separadores que no existieran en la cadena. Ademas la funcion Split es muy suya y cuesta descubrir como va a decidir devolverte el resultado con parametros no validos.

En fin, las pruebas "aleatorias" dicen que ya funciona bien, y yo ya estoy cansado de hacer pruebas :P

Si encontrais errores comentadmelo.

Saludos

Progmasterbr

Gracias PKJ!, su primera función es todavía su detección por Antivurus, y la segunda función, acusó archivo sospechoso en Avast, pero los dos trabajan perfectamente!