This has nothing to do with this list, which is for developing applications
using the Android SDK.

For questions regarding TaintDroid, please contact the TaintDroid authors.

For questions regarding custom firmware development, please visit
http://source.android.com.

On Thu, Jun 14, 2012 at 7:54 AM, marie <[email protected]> wrote:

> Hello,
> I found these three structures in the taintrdoid source code and I want to
> know :
>
>    -   what is the role of each structure and how to handle exeption in
>    android?
>
>
>    -     Where can I find the stored exceptions associated to a given
>    methode?
>
>
>    -     Where the declared_exceptions associated to a methode are stored?
>
>
>    -     And where the catches are stored ?
>
>
> For example in the getCaughtExceptionType it has 2 for loop (what is the
> role of each loop)?
>
>
>
> *typedef struct DexTry* {
>     u4  startAddr;          /* start address, in 16-bit code units */
>     u2  insnCount;          /* instruction count, in 16-bit code units
> */
>     u2  handlerOff;         /* offset in encoded handler data to
> handlers */
> } DexTry;
>
>
> *typedef struct DexCatchHandler* {
>     u4          typeIdx;    /* type index of the caught exception type
> */
>     u4          address;    /* handler address */
> } DexCatchHandler;
>
>
> *typedef struct DexCatchIterator* {
>     const u1* pEncodedData;
>     bool catchesAll;
>     u4 countRemaining;
>     DexCatchHandler handler;
> } DexCatchIterator;
>
>
>
> /*
>  * For the "move-exception" instruction at "insnIdx", which must be at an
>  * exception handler address, determine the first common superclass of
>  * all exceptions that can land here.  (For javac output, we're probably
>  * looking at multiple spans of bytecode covered by one "try" that lands
>  * at an exception-specific "catch", but in general the handler could be
>  * shared for multiple exceptions.)
>  *
>  * Returns NULL if no matching exception handler can be found, or if the
>  * exception is not a subclass of Throwable.
>  */
> *static ClassObject* getCaughtExceptionType*(const Method* meth, int
> insnIdx,
>     VerifyError* pFailure)
> {
>     VerifyError localFailure;
>     const DexCode* pCode;
>     DexFile* pDexFile;
>     ClassObject* commonSuper = NULL;
>     bool foundPossibleHandler = false;
>     u4 handlersSize;
>     u4 offset;
>     u4 i;
>
>     pDexFile = meth->clazz->pDvmDex->
> pDexFile;
>     pCode = dvmGetMethodCode(meth);
>
>     if (pCode->triesSize != 0) {
>         handlersSize = dexGetHandlersSize(pCode);
>         offset = dexGetFirstHandlerOffset(**pCode);
>     } else {
>         handlersSize = 0;
>         offset = 0;
>     }
>
>    * for (i = 0; i < handlersSize; i++) {
> *        DexCatchIterator iterator;
>         dexCatchIteratorInit(&**iterator, pCode, offset);//Initialize a
> DexCatchIterator to a particular handler offset
>
>   *      for (;;) {*
>             const DexCatchHandler* handler = 
> dexCatchIteratorNext(&**iterator);/*
> Get the next item from a DexCatchIterator. Returns NULL if at end. */
>
>             if (handler == NULL) {
>                 break;
>             }
>
>             if (handler->address == (u4) insnIdx) {
>                 ClassObject* clazz;
>                 foundPossibleHandler = true;
>
>                 if (handler->typeIdx == kDexNoIndex)
>                     clazz = gDvm.classJavaLangThrowable;
>                 else
>                     clazz = dvmOptResolveClass(meth->**clazz,
> handler->typeIdx,
>                               **  &localFailure);
>
>                 if (clazz == NULL) {
>                     LOG_VFY("VFY: unable to resolve exception class %u
> (%s)\n",
>                         handler->typeIdx,
>                         dexStringByTypeIdx(pDexFile, handler->typeIdx));
>                     /* TODO: do we want to keep going?  If we don't fail
>                      * this we run the risk of having a non-Throwable
>                      * introduced at runtime.  However, that won't pass
>                      * an instanceof test, so is essentially harmless. */
>                 } else {
>                     if (commonSuper == NULL)
>                         commonSuper = clazz;
>                     else
>                         commonSuper = findCommonSuperclass(clazz,
> commonSuper);//Find the first common superclass of the two classes
>                 }
>             }
>         }
>
>         offset = dexCatchIteratorGetEndOffset(&**iterator, pCode);/* Get
> the handler offset just past the end of the one just iterated over.
>  * This ends the iteration if it wasn't already. */
>     }
>
>     if (commonSuper == NULL) {
>         /* no catch blocks, or no catches with classes we can find */
>         LOG_VFY_METH(meth,
>             "VFY: unable to find exception handler at addr 0x%x\n",
> insnIdx);
>         *pFailure = VERIFY_ERROR_GENERIC;
>     } else {
>         // TODO: verify the class is an instance of Throwable?
>     }
>
>     return commonSuper;
> }
> thank you
>
> --
> You received this message because you are subscribed to the Google
> Groups "Android Developers" group.
> To post to this group, send email to [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> For more options, visit this group at
> http://groups.google.com/group/android-developers?hl=en




-- 
Mark Murphy (a Commons Guy)
http://commonsware.com | http://github.com/commonsguy
http://commonsware.com/blog | http://twitter.com/commonsguy

Android Training... At Your Office: http://commonsware.com/training

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to